Xiaoxia[PG]

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

Linux、我的代码27 条评论

219


在多进程编程的时候,经常会遇到这样的情况。父进程创建了一堆子进程,当遇到错误或者操作失误的时候把父进程关闭了,但是子进程还在跑,不得不一个一个地杀死子进程,或者使用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'

#fork.linux#multiprocessing#prctl

27 条评论

  1. 是pkill -P `pid of parent process`的意思么?

    1. 应该是这个意思吧 🙂

  2. 「This call is Linux-specific.」

  3. xiaoxia,你的wordpress不支持手机浏览。。d4就支持。。不知道可以修改下不。

    1. 可以呀,我有时候也用手机浏览。你手机用什么浏览器呢?我用chrome和opera mini。

  4. 又是讨厌的python……

  5. 对子进程的子进程有效么?

  6. 小虾 你的常用邮箱是多少啊? 怎么给你信 你都不回复的啊?

    1. 发到[email protected]就行了呀!!! 什么时候给我发邮件了呢。我好像一周才收一次邮件。

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

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

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

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

    1. OK写完了,明天debug一下,最完后天就可以放出来了

      1. 支持分享!!!!
        🙂

          1. Wow 😀
            I will dive into your code later...

            你觉得git好用吗?

            1. 挺好用的,除了某些简单操作太复杂,如撤销一个 commit……

              简单说:犯错很容易,改正很困难!

              1. 我觉得用惯了SVN的同学比较难切换到git的方式。。。

                1. 我在学校这种极端的网络环境下用了Git后就再也不想用SVN了......

                  1. 我也想学习git了。。。

    2. 我之前也用过类似你的方法,但是,如果父进程被SIGKILL了,就失效了。。。

      1. 子进程会检查pid的哦,即使父进程被SIGKILL了,子进程也会发现问题。

        1. 现在还0没看代码。
          难道子进程有专门的线程的轮询机制?

  8. 不结束不就是后台么=,=

  9. 不结束不就是后台么=,=

发表评论

评论会经过自动审核,链接请勿超过 3 个。