我读了之前的问题Differences between fork and exec,但这让我有些疑惑。
使用fork()
并且对孩子调用exec时,由exec
创建的新流程仍然是孩子吗?
杀死父进程是否也会杀死孩子?
在the top answer中显示的图/示例中,他调用wait
/ waitpid
,因为如果父进程首先终止,则子进程会终止,然后您将获得部分输出或不输出ls
命令是正确的吗?
答案 0 :(得分:3)
exec
用新的过程映像替换当前正在执行的过程映像。所以,是的,孩子是一个孩子的过程(实际上是同一个过程。)
不,杀死父母不会杀死孩子(孩子是orphaned)。
答案 1 :(得分:2)
杀死父进程不会杀死该进程。当子进程调用exec
函数时,它仍然是子进程。
在链接问题的示例中,流程图粗略地描述了shell用于调用命令的过程。除非命令是后台接地的,否则shell(父进程)将等待子进程终止,然后再继续读取命令。否则,没有必要等待孩子。
答案 2 :(得分:2)
使用fork()并在子进程上调用exec时,新进程 由exec创建的还是孩子吗?
当给孩子调用exec时,孩子会处理新的过程。子进程被exec调用替换。
杀死父进程是否也会杀死孩子?
当父进程死亡(至少在Linux中)时,通过让OS发送信号,子进程可能会死掉,但除此之外它就会继续存在。
他调用wait / waitpid,因为如果父进程先终止, 子进程死了,然后你得到部分或没有输出 ls命令,这是正确的吗?
您需要等待子进程(如您指向的示例中所示),以便: a)完成后,您可以正确终止您的子进程 b)子进程可以访问父进程的所有资源...这意味着如果您的孩子有父进程打开的文件句柄并且父进程退出,但是孩子认为该文件只要它正在运行就会打开,坏事会发生。
看看这个简单的例子: 首先,查看流程列表的输出:
mike@linux-4puc:~> ps
PID TTY TIME CMD
18577 pts/2 00:00:00 bash
18643 pts/2 00:00:00 ps
然后运行这个小程序:
void main()
{
if(fork()){
printf("parent print");
}
else
while(1);
printf("done");
}
在这里,您将让父母打印消息“父打印”然后“完成”。完成后检查“ps”列表,你会看到树中的新进程挂出:
mike@linux-4puc:~> ps
PID TTY TIME CMD
18577 pts/2 00:00:00 bash
18673 pts/2 00:00:02 a.out
18678 pts/2 00:00:00 ps
a.out是孩子,在父母终止时永远坐在while循环中。
答案 3 :(得分:2)
.. the new process created by exec is still a child right?
是的,它仍然是孩子。
Does killing the parent process kills the child too?
没有。如果父母因任何原因而死亡且孩子仍在执行,那么孩子将被init process(进程ID = 1)进程采用,这将成为此{{3}的新父进程}}
calls wait/waitpid because if the parent process terminates first, the child...
orphan process用于将孩子的状态通知父母。请注意,如果父进程有许多子进程,那么除非您指定特定子进程的进程ID,否则它通常会等待任何子进程。