繁体   English   中英

在父级死后,Linux中如何将子级进程置于前台?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM