#! /usr/bin/env python import sys,os,signal def CHLD_handler(signal,ignore): """Traitant de l'interruption SIGCHLD""" (pid,statut) = os.waitpid(-1,0) if os.WIFEXITED(statut): print "**pere** child %d terminated normally with exit status=%d" %\ (pid, os.WEXITSTATUS(statut)) else: print "**pere** child %d terminated abnormally" % (pid) ## ## Programme principal ## # Installe le traitant signal.signal(signal.SIGCHLD, CHLD_handler) # Creation des fils for i in range(10): pid = os.fork() if (pid == 0): print "------> fils (pid=%d). Je me termine." %(os.getpid()) sys.exit(1+i) else: print "**pere** fils cree, pid=%d" %(pid) # A tout moment l'execution peut etre interrompue par la reception # d'un signal SIGCHLD. Si le programme est en train de faire un appel # systeme (par exemple pour attendre une lecture clavier), cette # interruption provoque la levee d'une exception. # Probleme: si on est interrompu pendant qu'on attend une saisie # clavier, cette saisie est interrompue. # => Il faut donc recommencer la saisie en cas d'exception. # Astuce: Pour savoir si la saisie a ete interrompue, et donc savoir # s'il faut recommencer (avec une boucle while) il suffit de regarder # si la variable de saisie existe. while not 'saisie' in globals(): try: saisie = raw_input("**pere** tapez quelque chose...\n") except: # La reception d'un signal provoque l'interruption de la saisie pass print "**pere** Termine !" sys.exit(0)