// procAttend.cpp Un père crée des fils et attend leur fin // Utilisation de fork(), wait() // // Un processus lance n fils (n est argument de la commande) qui dorment // un certain temps, aléatoire au moins 1sec.. Le père attend la fin de // tous ses fils. // Le code retour des fils est leur temps de sommeil; le code retour du // père est 0. // // g++ -o p procAttend.cpp // p 5 #include <unistd.h> #include <sys/wait.h> #include <iostream> using namespace std; const int MAXFILS=50; int main(int ntm, char * tm[]) { pid_t idp; int i,nFils=3, cRendu, att; int ts[MAXFILS]; // temps, en seconde, d'attente de chaque fils if(ntm != 2){ cerr<<"Arguments incorrects"<<endl; cerr<<" procAttend nbProcessus tempsAttPere"<<endl; } else nFils = strtol(tm[1],NULL,10); if(nFils>MAXFILS) nFils=MAXFILS; // Générer les temps d'attente respectifs de chaque fils srand(getpid()); for(i=0; i<nFils; i++) ts[i]=1+rand()%6; cout<<"Ici "<<getpid()<<" --> nFils=" <<nFils<<endl; // Création de nFils fils for( i=0; i<nFils; i++) { idp = fork(); if(idp == 0) { //C srand(getpid()); att = 1+rand()%6; cout<<" un fils: "<<getpid()<<" ("<<ts[i]<<","<<att<<")"<<endl; sleep(ts[i]); return ts[i]; } } // Attente de la fin de tous les fils cerr<<" fin "; idp = wait(&cRendu); while( idp != -1) { cerr<<" "<<idp; idp = wait(&cRendu); } cerr<<"\nfin ... "<<getpid()<<endl; return 0; } //fin procAttend.cpp