c pipe:程序在等待前停止(NULL);

时间:2012-04-02 12:20:51

标签: c pipe

程序可以读取管道中的所有数据。但是,程序才停止。它无法继续处理。我认为它停止在儿童过程中。

//I created two pipe before fork (fd[0] and fd[1]).
//child process
if(pid == 0){
    close(fd[a][1]);
    buf[6];
    int i;
    while ((i = read(fd[a][0], buf, 6)) > 0) {
        printf("%s", buf);     
    }
    close(fd[a][0]);
exit(0); 
}

//parent process
write(fd[a][1], "12", 2);
write(fd[a][1], "14", 2);
write(fd[a][1], "15", 2);
write(fd[b][1], "12", 2);
write(fd[b][1], "14", 2);
write(fd[b][1], "15", 2);
printf("done!\n");
close(fd[0][1]);
close(fd[1][1]);
wait(NULL);
printf("Really done!!!\n");
...                      // The program cannot run after wait(NULL);

--output--
121415done

3 个答案:

答案 0 :(得分:0)

这两个进程陷入僵局,每个进程都在等待另一个进程。 您希望子进程停止处理,但它等待父进程,因为它不“知道”父进程不会再发送任何数据。 为了让孩子清楚,请关闭管道的书写端:

write(fd[0][1], "12", 2);
write(fd[0][1], "14", 2);
write(fd[0][1], "15", 2);
printf("done!\n");
close(fd[0][1]);
wait(NULL);

答案 1 :(得分:0)

您在while循环中发出read,有效阻止自己直到出现问题。如果您需要阅读6个字符,那么您就可以编写子进程:

char buf[7];
int left = 6;
int so_far = 0;   // instead of so_far, (6 - left) could also be used
while (left > 0)
     int num_read = read(fd[0][0], buf + so_far, left);
     left -= num_read;
     so_far += num_read;
}
buf[so_far] = '\0';
printf("%s\n", buf);     

答案 2 :(得分:0)

我怀疑你没有在子进程中关闭“写入”fd,因此对read的调用将阻塞,进而阻止父进程中的wait

另外:如果您在问题中省略了某些内容,例如对@ anatolyg答案的回复,您应该编辑问题。这是我最初给出的答案。