/** * * @File : exo_02.cxx * * @Authors : A. B. Dragut * * @Date : 2011 * * @Synopsis : Un pere cree CstNbreFils fils. Le ieme fils dort i secondes. * le pere attend la mort de chaque fils avec waitpid() et l'analyse * avec WIFEXITED et WEXITSTATUS(status) * ATTENTE INCORECTE! POTENTIELLEMENT : BLOQUAGE, PERTE des SIGNAUX! * **/ #include #include #include #include // atoi() #include // SIGCHLD #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!" << 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]); ::pid_t TabPid [CstNbreFils]; Signal (SIGCHLD, Derout); for (int i = CstNbreFils; i; --i ){ if (!(TabPid[i]=Fork())) //fils i { cerr << "Le fils "<<::getpid() <<" dormira " << i << " secondes\n"; ::sleep (i); return i; } } int status; ::pid_t Fils; for (int i = CstNbreFils;i;--i ) { Fils=TabPid[i]; Waitpid(TabPid[i],&status,0); cout << "Le fils de pid " << Fils << " est termine "<