python fork子进程(二)

来源:互联网 发布:我的淘宝等级怎么看 编辑:程序博客网 时间:2024/04/29 20:12

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

       

#coding=utf-8import osimport timeimport signalimport errnodef 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'发生异常退出'                    breakif __name__ == '__main__':    main()
        程序运行后,control+c,平时这个命令都会将程序杀死,但是由于我们在进程中监听了这个信号,并做了处理,因此,父子进程都不会退出,但是这个信号会打断waitpid这个函数。

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

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

0 0
原创粉丝点击