多次分叉后写入管道不起作用

Posted

技术标签:

【中文标题】多次分叉后写入管道不起作用【英文标题】:Writing to a pipe is not working after many fork 【发布时间】:2014-01-28 05:42:23 【问题描述】:

我有以下测试程序,我喜欢将数据从最深的孩子发送(写入)到父母。

代码是:

#define M1 "Message One"
int main(int argc, char **argv) 
int f1[2];
char buff[32];

pipe(f1);

if (fork() == 0) 
    if (fork() == 0) 
        if (fork() == 0) 
            printf("%s :%d\n", "f1[0] :",f1[0]);
            while(read(f1[0], buff, sizeof(buff)) > 0)
                 printf("%s\n", buff);
                     return 0;
          else 
            //do nothing
        
     else 
        //do nothing
    

 else     
    sleep(2);
    printf("%s :%d\n", "f1[1] :",f1[1]);
    if(write(f1[1], M1, sizeof(M1) < 0))
    printf("%s\n","Error");
    return 0;

return 0;

我的代码的问题是,程序没有打印消息。

我不确定这是否与许多分叉有关。

【问题讨论】:

【参考方案1】:

关闭未使用的文件描述符就可以正常工作了

在最里面的孩子

close(f1[1]);

在父进程中

close(f1[0]);

而且行中的语法错误也被称为将其更改为

write(f1[1], M1, sizeof(M1)) < 0)  

【讨论】:

【参考方案2】:

将您的 if 语句更改为

if (write(f1[1], M1, sizeof(M1)) < 0)

而不是

if(write(f1[1], M1, sizeof(M1) < 0))

【讨论】:

以上是关于多次分叉后写入管道不起作用的主要内容,如果未能解决你的问题,请参考以下文章

管道 ppm 图像到 eog 图像查看器不起作用

分叉时从 rc.local 自动运行不起作用 (&)

调用打开文件对话框后文件写入不起作用

rails 测试在 gitlab 管道中不起作用

Chartjs:更新数据后常见的可点击图例不起作用

Oracle Forms 10g,多次插入和更新不起作用