shell - 后台进程在终止前捕获进程 id

  显示原文与译文双语对照的内容
0 0

我正在尝试模拟C的背景和前景过程。 如果在结束时有'&'符号,我将避免在父进程中等待那个子进程。 我还存储在列表中执行的所有背景命令,并尝试在完成后从列表中删除它们。 但是在-l&中,输出会立即显示,只要按下进入进程就会终止。 如果与列表中的现有pid匹配,如何捕获该进程in并从列表中删除。


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

希望清楚,如果有疑问,请提问

时间: 原作者:

0 0

通常情况下,在循环中使用 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,以查看该子对象是否已经死,否则将指定 to 。

WNOHANG意味着'如果当前没有尸体,请不要挂起等待子进程死亡';使用 0意味着'等待,直到合适类别的子类别确实死亡',尽管没有这样的子节点,调用将返回。

如果流程组中有多个子级,则不保证返回尸体的顺序,就像对子级的命令没有保证。

你的需求是什么并不完全清楚。 例如你可以根据最后一个管道是否在后台运行来选择 waitpid()的最后一个参数。 如果你以前在后台启动一个进程,你可以在任何时候收集它的尸体。 你可能会根据情况选择 waitpid()的第一个参数。

原作者:
...