小编Eri*_*c31的帖子

当read()阻塞时如何退出while循环

在大学给出的问题中,我们必须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)

c linux pipe

1
推荐指数
1
解决办法
80
查看次数

标签 统计

c ×1

linux ×1

pipe ×1