/** * * @File : exo_03.cxx * * @Authors : A. B. Dragut * * @Date : 2011 * * @Synopsis : Un pere cree CstNbreFils fils. Le ieme fils dort i secondes. * le pere ne recupere pas le status de ses fils mais il ne cree pas * des zombies. Il a delegue le travail a init. * ATTENTE CORRECTE! * **/ #include #include #include #include // atoi() #include // SIGCHLD #include // SA_NOCLDWAIT (depuis Linux 2.6) #include // pause(), sleep() #include "CExc.h" #include "nsSysteme.h" // Fork(), Signal() using namespace std; using namespace nsSysteme; // Fork(), Signal() #define GETSTATUS(status) (((status) >> 8) & 0xff) namespace { void Derout (int) { cout << "Un fils est termine! On laisse init s'occuper de son status" << endl; } } // namespace anonyme int main(int argc, char * argv []) { try { if (2 != argc) throw CExc("main()",string ("Usage : ") + argv [0] + " "); const int CstNbreFils = atoi (argv [1]); // Si SA_NOCLDWAIT est positionne lors de la mise en place // d'un traitant pour SIGCHLD, POSIX.1 ne specifie pas si // le signal SIGCHLD est genere lorsqu'un processus fils se termine. struct sigaction ActionSansZombies; ActionSansZombies.sa_flags=SA_NOCLDWAIT; sigemptyset(&ActionSansZombies.sa_mask); ActionSansZombies.sa_handler=Derout; Sigaction (SIGCHLD,&ActionSansZombies,NULL); // alternative SA_NOCLDSTOP // Pareil l'attribut n'a de sens que lors de // la mise en place d'un traitant/gestionnaire pour SIGCHLD for (int i = CstNbreFils; i; --i ){ if (!Fork()) //fils i { cout << "Le fils "<<::getpid() <<" dormira " << i << " secondes"<