在大学给出的问题中,我们必须pipe从父进程(P1)到其子P2,然后P2必须管道到P1的另一个孩子,另一个孩子是P3.P2和P3都用c编写并制成可执行文件.然后他们将通过execP1中的子进程编辑.
P1将数字1写入10000到10000 stdout,P2通过它读取它们stdin,删除可被2整除的数字,并将结果写入其中stdout.P3通过它读取这些数字stdin,过滤掉可被3整除的结果,并将所有内容写入文件.
我已经成功实现了一切,但我的孩子流程并没有结束.我相信,其原因是我使用以下方法来读取每个子进程中的输入:
while(n=read(0, &i, sizeof(i))>0)
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这里的问题是read当它没有得到任何字节时的块.由于P1使用以下方法写入10000个数字:
for(i=1; i<=10000; i++){
write(1, &i, sizeof(i));
}
Run Code Online (Sandbox Code Playgroud)
儿童进程都没有任何理由相信没有更多的数据可以实现.因此,每个都read只是阻塞等待永远不会到来的字节.
任何人都可以建议一种方法来克服这个障碍吗?
每个过程的代码如下:
家长:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<sys/wait.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
// pipe to send input string from parent
// Child prints to file
int fd1[2]; // Used to store two ends of first pipe
int fd2[2]; // Used to store two …Run Code Online (Sandbox Code Playgroud)