后台进程在终止之前捕获进程ID

我试图在C中模拟背景和前景过程。如果在最后有'&'符号,我会避免在父进程中等待那个subprocess。 我也存储了我在列表中执行的所有后台命令,并在完成后尝试从列表中删除它们。 但在ls -l的情况下,立即显示输出,只需按回车就可终止。 如何捕获该进程ID,并将其从列表中删除,如果它与列表中现有的pid匹配。

pid = fork(); //Code to add pid into a list if it is a background process //this is done by parent as pid is always 0 for child processes if(pid == 0){ if(proc_state=='&'){ setsid(); } // logic for creating command int ret= execvp( subcomm[0], subcomm ); // handling error } //Parent will execute this //Child will never come here if execvp executed successfully if(proc_sate != '&'){ for(i=0; i < count_pipe+1; i++){ int ret = waitpid(0, &flag ,0); // Code to remove procid from list if 'ret' matches with existing procid in the list. } } //Here proc_state just determines whether it is background or foreground.It is just a character. count_pipe is just a //variable holding number of pipes 

希望我清楚。 如有疑问请提问

通常情况下,你可以像下面这样使用waitpid()

 int status; pid_t corpse; while ((corpse = waitpid(0, &status, WNOHANG)) != -1) { /* Process PID of child that died with given status */ ... } 

这会收集所有已经死亡的孩子,但是当没有更多的尸体可以收集时会回来。 选项0表示“我的过程组中有任何死亡的孩子”; 另一种选择-1意味着“任何死亡的孩子”。 在其他情况下,您可以指定一个特定的PID来查看该子项是否已经死亡,或者负数将指定PGID等于绝对值的进程组中的任何子项。

WNOHANG的意思是“如果没有死亡的尸体,不要等待孩子死亡”。 使用0表示“等到相应类别的孩子死亡”,尽管当没有这样的孩子离开时电话将会返回。

如果在过程组中有多个孩子,那么就不能保证尸体的返回顺序,就像不能保证孩子的死亡顺序一样。

目前还不完全清楚你的要求是什么。 例如,可以根据最后一个启动的管道是否在后台运行,选择waitpid()的最后一个参数。 如果您之前在后台启动了一个进程,您几乎可以随时收集它的尸体(除非您正在等待另一个进程组或除了该后台PID以外的特定PID)。 你可能根据具体情况选择waitpid()的第一个参数。