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

fork自分自身をing してing する代わりに、自分がやりたいことを行うためにdup便利に使用できます。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後で出力を解析してファイルまたはディレクトリを検索する場合は、 Unixopendirで ,readdirおよび関数を使用する方がはるかに優れていることに注意してください。closedir

于 2012-10-22T12:19:04.163 に答える