gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:30:56 25 4
gpt4 key购买 nike

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com