在多进程编程的时候,经常会遇到这样的情况。父进程创建了一堆子进程,当遇到错误或者操作失误的时候把父进程关闭了,但是子进程还在跑,不得不一个一个地杀死子进程,或者使用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'
是pkill -P `pid of parent process`的意思么?
应该是这个意思吧 🙂
「This call is Linux-specific.」
watchdog!
worship!
xiaoxia,你的wordpress不支持手机浏览。。d4就支持。。不知道可以修改下不。
可以呀,我有时候也用手机浏览。你手机用什么浏览器呢?我用chrome和opera mini。
又是讨厌的python……
对子进程的子进程有效么?
小虾 你的常用邮箱是多少啊? 怎么给你信 你都不回复的啊?
发到[email protected]就行了呀!!! 什么时候给我发邮件了呢。我好像一周才收一次邮件。
我就给你这个邮箱发过邮件 啊。。。。。会不会进垃圾箱了啊?? 死咯,我错在不应该用我的邮箱来做wordpress的回复自动提醒的帐号。。。。。不知道是不是这样的原因 你就收不到呢?下次等我改一下才行。。。。
写个库叫 childrenkiller 好了。父进程ck_init();,这个函数 atexit (kill_children);,kill_children 函数杀死在列表中的子进程。atexit后,再加一个 SIGCHLD 的处理函数,每当一个子进程退出就删掉一个列表项目。
要生成子进程就 ck_fork ();,获取pid后放入列表。子进程则一直检查ppid,如果成init的pid了就退出。
于是就诞生了可移植的玩意~
OK写完了,明天debug一下,最完后天就可以放出来了
支持分享!!!!
🙂
于是写完了 https://github.com/ekd123/ekode/tree/master/ck
ck的readme非常有趣
Wow 😀
I will dive into your code later…
你觉得git好用吗?
挺好用的,除了某些简单操作太复杂,如撤销一个 commit……
简单说:犯错很容易,改正很困难!
我觉得用惯了SVN的同学比较难切换到git的方式。。。
我在学校这种极端的网络环境下用了Git后就再也不想用SVN了……
我也想学习git了。。。
我之前也用过类似你的方法,但是,如果父进程被SIGKILL了,就失效了。。。
子进程会检查pid的哦,即使父进程被SIGKILL了,子进程也会发现问题。
现在还0没看代码。
难道子进程有专门的线程的轮询机制?
不结束不就是后台么=,=
不结束不就是后台么=,=
Pingback引用通告: 泡面的Blog » (转载)父进程结束后,子进程自动结束