2

私はさまざまなプロセス(正確には3つ)を作成し、それらにさまざまなことをさせています。ここまでは順調ですね。すべての子が完了するまで、親で待機しようとしています。私は多くのオプション(以下にリストされているものなど)をいじりましたが、親は待機しますが、Enterを押してシェルに戻る必要があります(つまり、一部の子は親の後に完了しますか?)または親は決して戻りませんシェル。何か案は?さらにヘルプを探す場所へのポインタ? ありがとう

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

 #define READ_END 0
 #define WRITE_END 1


int main (int argc, char **argv) 
{
pid_t pid;
int fd[2];
int fd2[2];

pipe(fd);
pipe(fd2);

for (int i=0; i<3; i++) {
    pid=fork();

    if (pid==0 && i==0) {

        //never uses fd2, so close both descriptors
        close(fd2[READ_END]);
        close(fd2[WRITE_END]);

        printf("i'm the child used for ls \n");
        close(fd[READ_END]); /*close read end since I don't need it */
        dup2(fd[WRITE_END], STDOUT_FILENO);
        close(fd[WRITE_END]);
        execlp("ls", "ls", "-hal", NULL);


        break; /*exit for loop to end child's code */
    }

    else if (pid==0 && i==1) {
        printf("i'm in the second child, which will be used to run grep\n");
        close(fd[WRITE_END]);
        dup2(fd[READ_END], STDIN_FILENO);
        close(fd[READ_END]);

        close(fd2[READ_END]);
        dup2(fd2[WRITE_END], STDOUT_FILENO);
        close(fd2[WRITE_END]);
        execlp("grep", "grep","p",NULL);
        break;
    }
    else if (pid==0 && i==2) {

        //never uses fd so close both descriptors
        close(fd[READ_END]);
        close(fd[WRITE_END]);

        printf("i'm in the original process which will be replaced with wc\n");

        close(fd2[WRITE_END]);
        dup2(fd2[READ_END], STDIN_FILENO);
        close(fd2[READ_END]);
        printf("going to exec wc\n");
        execlp("wc","wc","-w",NULL);
        break;
        }
        else {
        //do parenty things
        }
        }

        wait(NULL); 
        while (1){
                wait(NULL);
                if(errno== ECHILD) {
                    printf("all children ended\n"); 
                    break;
                }
                }




        close(fd[READ_END]);
        close(fd[WRITE_END]);
        close(fd2[READ_END]);
        close(fd2[WRITE_END]);






return 0;

}

4

1 に答える 1

7

grepそしてwc決して出ないでください。

なんで?stdin で EOF を受け取ることはありません。

なんで?lsが の書き込み側を終了して閉じたとしてもpipe(fd)、メイン プロセスはまだ書き込み側がpipe(fd)開いているため、 の読み取り側はpipe(fd)さらにデータを待っています。同様のことがfd2:grep終了したとしてもwc、stdin で EOF を取得しません。

解決策:close待機する前に、メイン プロセス内のすべてのパイプ fds。

于 2009-12-14T01:05:10.110 に答える