在 Linux 应用中,父进程需要监控其创建的所有子进程的退出状态,可以通过如下几个系统调用来实现。

  • pid_t wait(int * statua)
    一直阻塞地等待任意一个子进程退出,返回值为退出的子进程的 ID,status 中包含子进程设置的退出标志。
  • pid_t waitpid(pid_t pid, int * status, int options)
    可以用 pid 参数指定要等待的进程或进程组的 ID,options 可以控制是否阻塞,以及是否监控因信号而停止的子进程等。
  • int waittid(idtype_t idtype, id_t id, siginfo_t *infop, int options)
    提供比 waitpid 更加精细的控制选项来监控指定子进程的运行状态。
  • wait3() 和 wait4() 系统调用
    可以在子进程退出时,获取到子进程的资源使用数据。

更详细的信息请参考帮助手册。

要重点说明的是:即使父进程在业务逻辑上不关心子进程的终止状态,也需要使用 wait 类系统调用的底层原因。

这其中的要点在于:在 Linux 的内核实现中,允许父进程在子进程创建之后的任意时刻用 wait() 系列系统调用来确定子进程的状态。

也就是说,如果子进程在父进程调用 wait() 之前就终止了,内核需要保留该子进程的终止状态和资源使用等数据,直到父进程执行 wait() 把这些数据取走。

在子进程终止到父进程获取退出状态之间的这段时间,这个进程会变成所谓的僵尸状态,在该状态下,任何信号都无法结束它。如果系统中存在大量此类僵尸进程,势必会占用大量内核资源,甚至会导致新进程创建失败。

如果父进程也终止,那么 init 进程会接管这些僵尸进程并自动调用 wait ,从而把它们从系统中移除。但是对于长期运行的服务器程序,这一定不是开发者希望看到的结果。所以,父进程一定要仔细维护好它创建的所有子进程的状态,防止僵尸进程的产生。

在 Linux 应用中,父进程需要监控其创建的所有子进程的退出状态,可以通过如下几个系统调用来实现。pid_t wait(int * statua)一直阻塞地等待任意一个子进程退出,返回值为退出的子进程的 ID,status 中包含子进程设置的退出标志。pid_t waitpid(pid_t pid, int * status, int options)可以用 pid 参数指定要等待的...
一个进程可以通过 fork()或 vfork()等系统调用创建一个 进程,一个新的进程就此诞生!事实上,Linux系统下的所有进程都是由其父进程创建而来,譬如在 shell 终端通过命令的方式执行一个程序./app,那么 app进程就是由 shell 终端进程创建出来的,shell 终端就是该进程的父进程。既然所有进程都是由其父进程创建出来的,那么总有一个最原始的父进程吧,否则其它进程是怎么创建出来的呢?确实如此,在 Ubuntu 系统下使用"ps -aux"命令可以查看到系统下所有进程信息,如下:
监控 进程状态 最近在搞一个公司python的项目,主要的功能是先创建一个主进程然后根据计算系统的逻辑CPU个数来计需要fork多少个 进程来做相同的操作,然后会定时的去监听这些 进程的状态,原先设计的时候是直接判断创建的 进程个数和配置的进程个数是否一样,如果大于或者小于就重启服务,今天由于一个偶然的bug,直接kill -15一个 进程后发现该服务没有重启,需要将这种情况考虑进去,其中包含该进程死掉了,或者成为了僵尸进程。 2.什么为僵尸进程? 僵尸进程从其他资料上看,描述的都是 进程执行完逻辑