Linux下让父进程结束后,子进程自动结束


在多进程编程的时候,经常会遇到这样的情况。父进程创建了一堆子进程,当遇到错误或者操作失误的时候把父进程关闭了,但是子进程还在跑,不得不一个一个地杀死子进程,或者使用ps,grep,awk,kill来配合批量杀死。

之前在写 xxfpm(一个PHP-CGI的进程管理) 的时候,在Linux下使用父进程给子进程信号通知的方式来达到用户杀死父进程时,子进程也随即关闭。但是这种方法不太完美。例如,如果父进程被KILL信号杀死,完全没有机会给子进程发送信号了。

在网上搜了一下,用Linux下libc的prctl设置PR_SET_PDEATHSIG属性,似乎可以让子进程在父进程自动结束后接收到信号。这个方法似乎很完美!!!

PR_SET_PDEATHSIG (since Linux 2.1.57)
              Set the parent process death signal of the calling process to arg2
              (either a signal value in the range 1..maxsig, or 0 to clear).  This is
              the signal that the calling process will get when its parent dies.
              This value is cleared for the child of a fork(2).

测试代码:

#!/usr/bin/env python

import os
import ctypes
import time

libc = ctypes.CDLL('libc.so.6')

for i in xrange(4):
    pid = os.fork()
    if pid == 0:
        libc.prctl(1, 15)
        while True:
            print 'Child:', i
            time.sleep(1)
        raise SystemExit

print 'Wait for 10 sec...'
time.sleep(10)
print 'Exit'

Linux下让父进程结束后,子进程自动结束》有28个想法

      1. 艳文

        我就给你这个邮箱发过邮件 啊。。。。。会不会进垃圾箱了啊?? 死咯,我错在不应该用我的邮箱来做wordpress的回复自动提醒的帐号。。。。。不知道是不是这样的原因 你就收不到呢?下次等我改一下才行。。。。

        回复
  1. Mike

    写个库叫 childrenkiller 好了。父进程ck_init();,这个函数 atexit (kill_children);,kill_children 函数杀死在列表中的子进程。atexit后,再加一个 SIGCHLD 的处理函数,每当一个子进程退出就删掉一个列表项目。

    要生成子进程就 ck_fork ();,获取pid后放入列表。子进程则一直检查ppid,如果成init的pid了就退出。

    于是就诞生了可移植的玩意~

    回复
  2. Pingback引用通告: 泡面的Blog » (转载)父进程结束后,子进程自动结束

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据