fork()、exec和waitpid()
我读了前面的问题,但它给我留下了一些疑问 使用fork()、exec和waitpid(),c,unix,process,fork,wait,C,Unix,Process,Fork,Wait,我读了前面的问题,但它给我留下了一些疑问 使用fork()并对子进程调用exec时,由exec创建的新进程仍然是子进程,对吗 杀死父进程也会杀死子进程吗 在中所示的图形/示例中,他调用wait/waitpid,因为如果父进程先终止,子进程将终止,然后您将获得ls命令的部分输出或无输出,对吗?终止父进程不会终止子进程。当子进程调用exec函数时,它仍然是一个子进程 在链接问题的示例中,流程图大致描述了shell调用命令的过程。除非命令是反向固定的,否则shell(父进程)将等待子进程终止,然后继续
fork()
并对子进程调用exec时,由exec
创建的新进程仍然是子进程,对吗
杀死父进程也会杀死子进程吗
在中所示的图形/示例中,他调用
wait
/waitpid
,因为如果父进程先终止,子进程将终止,然后您将获得ls
命令的部分输出或无输出,对吗?终止父进程不会终止子进程。当子进程调用exec
函数时,它仍然是一个子进程
在链接问题的示例中,流程图大致描述了shell调用命令的过程。除非命令是反向固定的,否则shell(父进程)将等待子进程终止,然后继续读取命令。否则就没有必要等孩子了
另请参见。
exec
将当前正在执行的进程映像替换为新映像。是的,子进程是一个子进程(实际上是同一个进程)
不,杀死父母不会杀死孩子(孩子是)
使用fork()并对子进程调用exec时,新进程
由exec创建的仍然是子对象,对吗
在对子进程调用exec时,新进程由子进程处理。子进程被exec调用替换
杀死父进程也会杀死子进程吗
通过让操作系统发送一个信号,当父进程死亡时(至少在Linux中),子进程可能会死亡,但否则它就继续存在
他调用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循环中
.. the new process created by exec is still a child right?
是的,还是那个孩子
Does killing the parent process kills the child too?
否。如果父进程因任何原因死亡,而子进程仍在执行,则该子进程将被(进程ID=1)进程采用,该进程将成为该进程的新父进程
用于向父级通知子级的状态。请注意,如果父进程有多个子进程,则除非您指定特定子进程的进程ID,否则它通常会等待任何子进程。“在子进程上调用exec时,新进程将由子进程处理。子进程将被exec调用替换,然后在完成后放回。”否:调用
exec
不会创建新进程。这仍然是相同的子进程。exec
所做的是替换流程的代码和数据。我不知道你所说的“完成后放回去”是什么意思,我想不出任何符合这个描述的东西。不:你指的是什么“原始执行路径”?什么时候做了什么?打开文件句柄示例很好地说明了如果孩子使用打开的文件,家长何时应该等待孩子。
calls wait/waitpid because if the parent process terminates first, the child...