1

首先,我想将 ls (exec) 的输出重定向到一个文件中,然后从一个文件重定向到管道,为什么不工作?当我在文件中重定向时没关系,但仅此而已。

我该怎么做才能找到输出的长度ls?(这就是我重定向到文件的原因)。

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>

int main()
{
    char input[]="ls",ch, delim[]=" ",*result,aux[2000],*user=NULL,*password=NULL,aux1[2000],aux2[2000],aux3[2000],aux4[2000],*arg[1000];
    int p1[2],p2[2],i,j,len,nrRead,ok,log,f;
    pid_t pid,pidd;
    pid=fork(); f=open("alice.txt",O_RDWR|O_TRUNC|O_CREAT,0700);

    if(pid == 0){
        i=0; 
        printf("f: %d",f);
        if(strlen(input) == 2) {arg[0]="ls";arg[1]=NULL; i=2;}
        else 
        {       
            result=strtok(input,delim);
            arg[i++]=result;
            result=strtok(NULL,delim);
            while(result!= NULL)
            {
                printf("LS --- 5\n");
                arg[i++]=result;
                result=strtok(NULL,delim);
            }
            arg[i]=NULL;
        }

        close (1);

        if (dup2(f,1) == -1)    
        {
            fprintf (stderr, "dup - 1\n");
            exit (9);
        }

        if( 0 == (pidd=fork())) { 
            execvp("ls",arg);
        }

        close(f);
        i=0;
        while(0 != read(1,&ch,sizeof(char)))
        { 
            aux4[i]=ch;
            i++;
        }
        aux4[i]='\0';

        close(1);
        if (dup2(p2[1],1) == -1)    
        {
            fprintf (stderr, "dup - 1\n");
            exit (9);
        }
        //close(p2[1]);
        len=strlen(aux4);
        //printf("LUNG: %d",len);
        write(1,&len, sizeof(4));       
        return 0;
    } else {
        wait(NULL);
        close(p2[1]);
        read(p2[0],&len,sizeof(int));
        printf("pp: %d",len);

    }
}
4

1 回答 1

0

代替forking 和duping 自己,您可以方便地popen用来做您想做的事。如果你真的需要事先知道输出的大小,你不需要重定向到一个文件,你可以简单地在你点击之前计算你可以从管道中读取的字节数EOF。示例(无错误检查):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fd;
    char *buf;
    size_t size; /* counter for output size */

    fd = popen("ls", "r"); /* open a pipe running ls for reading ("r") */

    size = 0;
    while (fgetc(fd) != EOF) {
        size++;
    }

    pclose(fd);

    printf("Output is %d bytes\n", size);

    fd = popen("ls", "r");

    buf = malloc(size+1);

    while (fgets(buf, size, fd)) {
        fputs(buf, stdout); /* do what you want here */
    }

    pclose(fd);

    return 0;
}

请注意,如果您打算ls稍后解析输出以查找文件或目录,则最好在 Unix 上使用opendir,readdir和函数。closedir

于 2012-10-22T12:19:04.163 回答