gpt4 book ai didi

C Linux编程-管道使子进程退出

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

我很难理解以下代码的行为。关闭文件描述符 p[0] 会使程序退出(否则父进程将永远等待子进程)。这对我来说没有意义,因为子进程正在运行一个无限的 while 循环,为什么它们会因为管道的读取端关闭而退出?当然,您将无法写入管道,但 while 循环不依赖于父进程的读取端是否打开。我尝试删除子进程中的 exit() 函数,但程序还是退出了,那么为什么子进程一注意到读取端已关闭就会自行终止?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main()
{
int run=10, fd[2]; pipe(fd); srand(time(0)); char ch, x='x', o='o';

if(!fork())
{
close(fd[0]);

while(run)
{
sleep(1+rand()%6); write(fd[1],&x,1);
}

exit(0); //This exit doesn't happen
}

if(!fork())
{
close(fd[0]);

while(run)
{
sleep(1+rand()%3); write(fd[1],&o,1);
}

exit(0); //This exit doesn't happen
}

close(fd[1]);
while(run--)
{
read(fd[0],&ch,1);
printf("%d %c\n",run,ch);
sleep(1);
}

close(fd[0]); //closing this file descriptor results in that the program can exit
wait(0);
wait(0);
exit(0);

}

最佳答案

这是标准行为。您关闭管道的读取端,因此无处可写。这导致 SIGPIPE 信号被发送到写入进程。

SIGPIPE 的默认行为是终止接收信号的进程。

如果你想让你的进程在信号中存活下来,你必须捕捉或忽略它。然后你必须检查 write 的结果,因为当管道读端关闭时它会返回一个错误。

关于C Linux编程-管道使子进程退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49192145/

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