Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fork()、exec和waitpid()_C_Unix_Process_Fork_Wait - Fatal编程技术网

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...