[英]How in Linux leave a child process in foreground after the parent dies?
假设我有一个Linux程序,该程序创建一个子进程,然后死亡,该子进程继续。 当我启动该程序时,shell在父母退出后立即显示提示。 我应该如何更改程序,使Shell使孩子处于前台?
int main(int argc, char *argv[])
{
switch (fork())
{
case -1:
perror("fork");
return 1;
case 0: // child
sleep(seconds(5));
printf("%07u %s: Process group ID = %d\n", getpid(), currTime("%T").c_str(), getpgrp());
printf("%07u %s: Foreground process group ID = %d\n", getpid(), currTime("%T").c_str(), tcgetpgrp(STDIN_FILENO));
break;
default: // parent
printf("%07u %s: Process group ID = %d\n", getpid(), currTime("%T").c_str(), getpgrp());
printf("%07u %s: Foreground process group ID = %d\n", getpid(), currTime("%T").c_str(), tcgetpgrp(STDIN_FILENO));
break;
}
return 0;
}
如果我开始上述操作,这就是shell会话的样子:
$ ./test
0007016 22:57.665929: Process group ID = 7016
0007016 22:57.666362: Foreground process group ID = 7016
$ 0007017 23:02.666229: Process group ID = 7016
0007017 23:02.666703: Foreground process group ID = 27254
我想要的是:
$ ./test
0007016 22:57.665929: Process group ID = 7016
0007016 22:57.666362: Foreground process group ID = 7016
0007017 23:02.666229: Process group ID = 7016
0007017 23:02.666703: Foreground process group ID = 7016
$
我应该如何更改程序,使Shell使孩子处于前台?
处于前台意味着在控制终端上属于前台进程组 。 现在,shell在执行程序时更改了前台进程组-启动程序时,前台进程组设置为程序的进程组,并且在父进程终止后,shell将前台进程组设置回自己的进程组组。
父程序终止后,程序中的父程序无法执行任何操作使外壳程序将子程序置于前台。 父级退出后,shell会立即撤消父级对前台进程组的所有更改。
而且,尽管子进程可以加入外壳程序的进程组,从而在父进程终止后成为前台进程组的成员,但这并不能实现您真正想要的(而不是您所要求的)-外壳程序仍然可以在父级退出后立即发出其输入提示,因为它明确地仅等待父级,而不等待子级。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.