创建和收获子进程

时间:2019-01-07 11:54:32

标签: linux process

我对创建和收获子流程有一些疑问。

Q1。为什么Linux会自动获取子进程,以便程序员不需要使用waitpid()来减少程序员的工作量?

Q2。创建子进程并让子进程执行程序的好处是什么? Web服务器调用fork创建一个子进程,并调用execve运行cgi程序?我们不能让父进程运行CGI程序吗?

2 个答案:

答案 0 :(得分:0)

  1. Linux不会自动获取进程,因为您可能希望派生一个子进程并终止父进程,即守护进程。您还需要一种获取子进程的退出代码的方法,如果没有这种机制,就无法获得它。如果您不想等待子进程,则在派生任何子进程之前启动应用程序调用{​​{1}}。

    由于记录窗口具有相同的用法模式,因此调用signal(SIGCHLD, SIG_IGN);来等待子线程终止,可以忽略,但是这样做是非常不好的做法,因为它会留下句柄并返回代码记忆。

  2. 除非使用多线程,否则父进程一次只能执行一个任务,而不能执行更多任务。通过派生子进程来处理传入的请求,您可以异步处理多个请求,例如:https://jameshfisher.com/2017/02/25/tcp-server-fork.html

答案 1 :(得分:0)

Q1。仅当父进程在子进程之前死亡时,Linux(或UNIX)才能获得子进程。在这种情况下,内核让一些实现定义的进程(以前是init进程)采用孤立进程。然后,这个新的父流程将对流程状态更改做出反应。

Q2。每个进程派生和处理一项任务是并行处理多个任务的一种方法。根据您的要求,这通常会比在一个流程中处理多个任务导致更简单的代码。在某些情况下,这是唯一可行的方法。使用线程是一种类似的解决方案。另一种解决方案是在所有可能阻塞的调用之前使用select,并确保您一个接一个地处理每个任务。

运行CGI程序意味着您必须运行脚本解释器。如果您自己没有实现解释器,则意味着您必须运行一个难以控制的单独程序。当脚本花费很长时间或由于某种原因而阻塞时,您不想阻塞所有其他任务。因此,在子进程中并行运行它要比在父进程或其他子进程中接受和处理请求更容易。 在这种情况下,很难或常常无法阻止单独的程序阻止其他任务,因此最好在子进程中执行此操作。