使用wait()时,无法读取管道?

时间:2012-03-07 08:37:35

标签: c pipe wait

这是一小段代码,父进程写管道和子读取管道,在父进程中添加'wait()'之前一切正常。我认为它应该没有区别,但它只是在我输入时卡住了。我对系统编程很陌生。任何人都可以帮忙吗?

int main() {
      char* msg = malloc(sizeof(100));
      int fd[2];
      pipe(fd);
      int status;


if (fork()!=0){
    close(fd[0]);
    dup2(fd[1],1);
    scanf("%s",msg);
    puts(msg);
    wait(&status);
}
else {
    char* buf = malloc(sizeof(100));
    close(fd[1]);
    dup2(fd[0],0);
    scanf("%s",buf);
    puts(buf);
}
return 0;}

3 个答案:

答案 0 :(得分:1)

您忘记在父母fd[1]电话后关闭dup2。此外,您需要编写一些字符,使scanf知道它已读取字符串的结尾。在致电puts后关闭stdout将是一种方式。

答案 1 :(得分:0)

您应该在advanced unix programming上阅读一本好书,学会使用poll(2)(或select,或pselectppoll)等多重调用,可能学会使用SIGCHLD。请注意,signal处理程序只能调用一组非常有限的函数(异步安全函数),并且通常应设置volatile sig_atomic_t变量。

答案 2 :(得分:0)

在致电stdout之前,您必须先刷新wait()

你的程序在没有wait()的情况下工作,因为在父进程退出时完成了隐式刷新。