Tag:

子程序不会在C程序中死亡

我正在编写一个C程序,它将STDIN中的输入解析为单词,生成由numsorts变量指定的多个排序进程,以循环方式将单词排序到每个排序进程,并发送排序的输出到STDOUT。 如果指定的排序进程的数量为1,我的程序将按照需要工作并干净地退出,但如果排序进程的数量大于1,则排序子进程不会死,并且我的程序会等待它们。 对我来说,最奇怪的部分是,如果我打开一个单独的终端窗口并杀死除1以外的所有孩子,最后一个孩子会立即自行死亡并且程序干净利落。 这是我的解析器代码(管道文件描述符存储在一个二维数组中): void RRParser(int numsorts, int **outPipe){ //Round Robin parser int i; char word[MAX_WORD_LEN]; //Close read end of pipes for(i = 0; i < numsorts; i++){ closePipe(outPipe[i][0]); } //fdopen() all output pipes FILE *outputs[numsorts]; for(i=0; i < numsorts; i++){ outputs[i] = fdopen(outPipe[i][1], "w"); if(outputs[i] == NULL) printf("Error: could not create output stream.\n"); } […]

如果我只是使用wait()等待1个孩子一次完成,我是否需要对SIGCHLD处理程序执行任何操作?

我有一个程序,要求孩子做一些工作,但我现在一次只做一个孩子。 我正在使用wait()等待孩子完成,我是否也需要对SIGCHLD做任何事情(例如禁用处理程序)? 在我的情况下,我在errno获得了EINTR的值,这让我认为我需要屏蔽SIGCHLD 。 从广义上讲,这是该计划: 读参数 for(工作清单) fork() 如果是child, execlp()来工作程序 如果是父母,则wait()孩子完成 当孩子完成时,父循环到下一个工作项

等待和/或杀死由fork生成的进程孙子

我将fork()分解为进程X和Y,之后Y forks()再次进入自身并多次处理Z. 现在流程Y是某种“听众”,我希望X成为删除者。 Z进程执行实际操作。 Z过程是X的孙子。 通过FIFO和一些信令,X生成了Z进程的所有pid列表。 现在的问题是我想用X删除Z进程僵尸(通过pid列表)。 我已经尝试使用waitpid() ,但当然这不起作用(它只适用于直接孩子)。 但我已经读到了为此自己做扩展的可能性。 但我真的不知道该怎么做。 我已经想到了删除器与僵尸保持另一个列表(退出时的信号)但这与我保存pid时的情况相同,我想以不同的方式做到这一点。 有人知道怎么做吗?