gpt4 book ai didi

c - 只有一个孙子被杀,而不是 5 个

转载 作者:太空狗 更新时间:2023-10-29 12:43:14 24 4
gpt4 key购买 nike

这是我上一个问题的从头开始写的。我真正需要实现的是:将来 parent 能够关闭 pipe 的一端,这样 grandchild (守护进程)就会收到 < strong>SIGPIPE。当我使用 1 种解决方案时,它就像一个魅力(但这是在任何 fork 之前)。当我使用 2 个解决方案时,只有一个写入生成 SIGPIPE。我该如何检查?通过发出:strace -f ./a.out 2>&1 | grep 管道

#include <sys/wait.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

void child_become_daemon( int pfd[][2], int id )
{
int pid = fork();
if( pid == 0 )
{
dup2( pfd[id][1], 1 );
close( pfd[id][0] );
sleep( 5 ); //this is to be sure that opposite end is already closed
write( 1, "child", strlen( "child" ) );
}
if( pid > 0 )
{
exit( 0 );
}
}

int main()
{
int pid;
int numKids = 5;
int procNum;

int pfd[numKids][2];
for( int i = 0; i < numKids; ++i )
{
pipe( pfd[ i ] );
//close( pfd[i][0] );//1 all killed - perfect
}

for( procNum = 0; procNum < numKids; procNum++ ) {
pid = fork();
if( pid == 0 ) {
break;
}
}

if( pid == 0 ) {
printf( "I'm child %d\n", procNum );
child_become_daemon( pfd, procNum );
}
else {
for( int i = 0; i < numKids; ++i )
{
printf( "closing %d\n", i );
close( pfd[i][0] );//2 why only one will get killed
close( pfd[i][1] );
}

char buf[124] = { 0 };
for( int i = 0; i < numKids; ++i )
{
read( pfd[i][0], buf, 124 );
printf( "buf: %s\n", buf );
}

int p, status;
while ((p = wait(&status)) != -1)
fprintf(stderr, "p %d exits with %d\n", p, WEXITSTATUS(status));
}

return 0;
}

最佳答案

孙辈继承了所有 5 个管道,因此他们每个人都打开了其他 4 个管道以供读取,因此没有 SIGPIPE。如果有一个“不幸”的时机,最后一个活着的人可能会得到一个 SIGPIPE,因为其他人都走了。

[编辑]你也无法真正知道,因为如果他们的 parent 已经死了,你就不能等待孙子进程。而且您不会在孙子孙女身上发现 SIGPIPE。

关于c - 只有一个孙子被杀,而不是 5 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34887788/

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