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