首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在命令退出后,shell不等待命令的子进程?

问为什么在命令退出后,shell不等待命令的子进程?
EN

Unix & Linux用户
提问于 2018-02-20 18:32:04
回答 2查看 3.2K关注 0票数 1

我一直在学习UNIX进程,一点也不懂。假设我们有这样的代码,

代码语言:javascript
复制
void fork_child()
{
    if (fork() == 0) {
       /* Child */
       printf("Running Child, PID = %d\n",
           getpid());
       while (1)
           ; /* Infinite loop */
    } else {
       /* Parent */
       printf("Terminating Parent, PID = %d\n",
              getpid());
       exit(0);
    }
} 

我知道我们会显式地终止子进程,因为父进程之前就死了,但是当我运行代码时,shell并不等待子进程中的while循环,这更像是在后台运行。这个问题的主要原因是什么?

谢谢

EN

回答 2

Unix & Linux用户

发布于 2018-02-20 18:43:20

您需要调用父进程中的wait()来阻塞,直到子节点被杀死为止。

请参阅:http://man7.org/linux/man-pages/man2/waitpid.2.html

票数 2
EN

Unix & Linux用户

发布于 2018-02-20 20:13:44

shell本身并不真正了解它启动的进程的子进程。比如说,shell启动进程A,然后启动进程B,然后A退出。现在发生的情况是,B继续运行,但它是init的一个子级,PID 1,它没有成为shell的子级。

Linux上的_exit(2)手册页 (有POSIX中类似的措辞):

进程的任何子进程都由init(1)继承。进程的父进程被发送一个SIGCHLD信号。

让祖父母继承的无父母进程不是一个好主意,因为新的父母需要负责接收来自孩子的SIGCHLD信号并调用wait()。任何执行其他程序的程序都需要为处理任意数量的儿童做好准备。

当然,如果子程序仍然持有shell正在读取的管道,例如命令替换,那么shell将不得不等待,因为它只能在管道关闭后才知道它已经接收到所有输入。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/425471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档