python fork子进程(二)

        父进程在wait子进程时,可能会发生失败,一种情况是被系统信号打断,一种是wait的pid不存在。上一篇里,waitpid采用的是非阻塞的,因此不会发生被系统信号打断的情况,下面给出一个例子,演示如果处理被系统打断的情况

       

#coding=utf-8
import os
import time
import signal
import errno

def child_work():
    while True:
        print 'I am child {name}'.format(name=os.getpid())
        time.sleep(3)


def signal_sigint(a,b):
    print 'my pid is {pid},you press contol +c ,but I will not exit,hehe'.format(pid =os.getpid())
def main():
    pid = os.fork()
    if pid == 0:
        signal.signal(signal.SIGINT,signal_sigint)
        child_work()
    else:
        signal.signal(signal.SIGINT,signal_sigint)
        while True:
            try:
                p,status = os.waitpid(pid,os.WUNTRACED|os.WCONTINUED)
            except OSError as e:
                if errno.EINTR == e.errno:
                    print u'wait 被系统信号中断'
                    continue
                elif errno.ECHILD == e.errno:
                    print u'没有什么可监听的'
                    break
                else:
                    print u'发生异常退出'
                    break



if __name__ == '__main__':
    main()
        程序运行后,control+c,平时这个命令都会将程序杀死,但是由于我们在进程中监听了这个信号,并做了处理,因此,父子进程都不会退出,但是这个信号会打断waitpid这个函数。

       如果wait的pid并不存在,就会引发 ECHILD这个错误,将第24行替换为

p,status = os.waitpid(45342,os.WUNTRACED|os.WCONTINUED)
      现在,运行程序,就会发生ECHILD错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值