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

标签 c linux

#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,然后管道断开。为什么? 代码有什么问题?

最佳答案

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

关于c - 为什么我的进程总是收到信号SIGPIPE,然后管道坏了。我在gdb看到了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28400932/

相关文章:

c - 未在链表末尾正确插入新节点

linux - 子进程会发生什么?

c - 手动输入时,Poll 在 stdin 上工作,但在输入通过管道传输且未重定向时不工作

linux - 系统调用如何从用户空间传播到内核空间并返回用户空间?

linux - 将多个shell脚本集成到一个脚本中

linux -/usr/include 中的头文件从哪里来? Linux 内核代码 或 Gcc

c - _Bool 有什么优势?

c - 返回指向指向字符串的结构的指针

c - "mkdir()"不工作

c - Valgrind 显示分配的内存比实际分配的内存多