我有一个用例,我有一个parent
进程的进程,它生成各种child
进程,每个进程监视一个ssh
连接。这个parent
进程应该作为服务的一部分无休止地运行。但是,当其中一个ssh
连接关闭时,该child
进程将成为zombie
进程。这样,每次关闭zombie
连接时,都会创建许多ssh
个进程。
我希望尽可能减少zombie
进程的数量。据我所知,SIGTERM
或SIGKILL
会删除zombie
进程。由于parent
进程无休止地运行,因此等待zombie
终止无法删除parent
进程。
有没有办法删除僵尸进程?或者我理解错的东西?
答案 0 :(得分:1)
在C编程中,您可以在父进程中使用waitpid系统调用。
在linux命令行或shell脚本中,您可以使用wait命令删除僵尸。
waitpid手册页,
waitpid()系统调用暂停执行调用进程,直到pid参数指定的子进程发生更改状态。默认情况下,waitpid()仅等待已终止的子节点,但此行为可通过options参数进行修改。
语法: -
pid_t waitpid(pid_t pid, int *status, int options);
如果你不想暂停父母,那么你就可以使用波纹管系统来清除僵尸进程。
int status;
waitpid(0, &status, WNOHANG);
当父进程确实收到子退出状态时,则只创建僵尸进程。因此,使用带有WNOHANG选项的waitpid,您可以收到子退出状态,如果提供了WNOHANG选项,它将不会阻止父级。是否有任何子项退出它将退出状态存储在状态变量中,然后返回。否则它不会等待,它只是返回。
尝试使用waitpid手册页来阅读有关waitpid系统调用的信息。