请参阅以下代码:
#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()的重要性.
这里发生的是父进程在子进程完成之前完成执行.导致孩子无法进入终端.
让我们仔细看看这一切.
怎么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() 两次.