我一直在学习UNIX进程,一点也不懂。假设我们有这样的代码,
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循环,这更像是在后台运行。这个问题的主要原因是什么?
谢谢
发布于 2018-02-20 18:43:20
您需要调用父进程中的wait()来阻塞,直到子节点被杀死为止。
发布于 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将不得不等待,因为它只能在管道关闭后才知道它已经接收到所有输入。
https://unix.stackexchange.com/questions/425471
复制相似问题