为啥我的进程总是收到信号 SIGPIPE,然后管道坏了。我在gdb看到的

Posted

技术标签:

【中文标题】为啥我的进程总是收到信号 SIGPIPE,然后管道坏了。我在gdb看到的【英文标题】:why my process always receive signal SIGPIPE, and then pipe broken. I saw it in gdb为什么我的进程总是收到信号 SIGPIPE,然后管道坏了。我在gdb看到的 【发布时间】:2015-02-09 00:07:39 【问题描述】:
#include<stdio.h>
int main()

        int pid = fork();
        int one[2];
        int two[2];
        int fp=pipe(one);
        int sp=pipe(two);
        int i;
        char *c1,*c2,a1[8],a2[8];
        c1="doggy";
        c2="wangwang";
        if(fp<0||sp<0)
        perror("pipe failed\n");
        if (pid == 0)
        
                close(one[1]);
                close(two[0]);
                for (i = 0; i < 5; i++)
                
                        read(one[0],a1,10);
                        printf("%d. %s\n", i + 1,c1);
                        write(two[1],c2,10);
                
        
        else
        
                close(one[0]);
                close(two[1]);
                for (i = 0; i < 5; i++)
                
                        printf("%d. %s\n", i + 1,c2);
                        write(one[1],c1,8);
                        read(two[0],a2,8);
                


                wait(NULL);
                                                                                          

我想通过管道同步父进程和子进程。但是在这段代码中,在 gdb 中,我总是收到信号 SIGPIPE,然后管道断开。为什么? 代码有什么问题?

【问题讨论】:

问:这段代码正确是什么?问:为什么要打开 fp 和sp? “one[]”和“two[]”在哪里被初始化? 在设置管道后尝试移动你的 fork 调用 如果下面的答案解决了您的问题,那么接受它是一件好事...... 【参考方案1】:

您需要在分叉之前设置管道。 fork() 将克隆内存,因此如果您之后设置管道,您不会得到一个与两个实例连接的管道,而是两个未连接的管道。此外,如果您有两个管道并从中读取和写入,这很危险。这可能会死锁,所以要小心(在你的例子中我认为没问题)。

【讨论】:

谢谢!你的答案是正确的!我会小心的。

以上是关于为啥我的进程总是收到信号 SIGPIPE,然后管道坏了。我在gdb看到的的主要内容,如果未能解决你的问题,请参考以下文章

为啥python在关闭fifo文件时会生成sigpipe异常?

SIGPIPE

为啥存在 SIGPIPE?

关于SIGPIPE导致的程序退出

sigwait 处理 SIGPIPE

Linux网络编程-SIGPIPE信号导致的程序退出问题