父进程在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错误。