如果父级不调用wait(),则同一父级的两个子节点不使用管道进行通信

my *_*YAN 2 c linux ipc pipe

请参阅以下代码:

#include<stdio.h>

main(){
        int pid, fds[2], pid1;
        char buf[200];
        pipe(fds);
        pid = fork();

        if(pid==0)
        {
                close(fds[0]);
                scanf("%s", &buf);
                write(fds[1], buf, sizeof(buf)+1);
        }
        else
        {
                pid1 = fork();

                if(pid1==0)
                {
                        close(fds[1]);
                        read(fds[0], buf, sizeof(buf)+1);
                        printf("%s\n", buf);
                }
                else
                {
       Line1:              wait();
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

如果我不评论Line1,它工作正常.请看下面:

hduser@pc4:~/codes/c/os$ ./a.out
hello //*Entry from keyboard*
hello //Output
hduser@pc4:~/codes/c/os$ 
Run Code Online (Sandbox Code Playgroud)

但是,如果我注释掉Line1,则两个子进程无法通信:

hduser@pc4:~/codes/c/os$ ./a.out
hduser@pc4:~/codes/c/os$ 
hi //*Entry from keyboard*
hi: command not found
hduser@pc4:~/codes/c/os$
Run Code Online (Sandbox Code Playgroud)

我无法理解wait()的重要性.

Moh*_*far 6

这里发生的是父进程在子进程完成之前完成执行.导致孩子无法进入终端.

让我们仔细看看这一切.

怎么wait()办?

wait()系统调用暂停执行调用进程,直到其子进程终止.

你的程序是这样的

你的main Processforks 2子进程.第一个写入管道而另一个写入管道.所有这些都在main process继续执行时发生.

当主进程执行代码时会发生什么?它终止了.当它终止时,它放弃对终端的控制.这导致孩子们无法访问终端.

这就解释了为什么你得到的command not found- 你输入的内容不是stdin你的程序,而是shell提示本身.


您的代码也存在其他一些问题,

1)在你的代码的这一部分,

            scanf("%s", &buf);
Run Code Online (Sandbox Code Playgroud)

这是错的.你不走运,并没有得到分段错误.既然buf已经是一个地址,那应该是

            scanf("%s", buf);
Run Code Online (Sandbox Code Playgroud)

2)注意这个,

            read(fds[0], buf, sizeof(buf)+1);
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为,如评论部分所述.您正在尝试读取更多数据并将其存储在较小的内存空间中.这应该是,

            read(fds[0], buf, sizeof(buf));
Run Code Online (Sandbox Code Playgroud)

3)打电话wait().你已经创建了两个子进程,你应该等待它们都完成,所以你应该调用wait() 两次.