/** * * @File : exo_06.cxx * * @Author : A. B. Dragut * * @Synopsis : section critique sigpocmask() * **/ #include #include #include #include #include #include // sort() #include // SIGINT, SIGQUIT, SIG_BLOCK, SIG_UNBLOCK, // sigset_t, sig_atomic_t, sigaddset(), sigemptyset() #include // sleep() #include "CExc.h" #include "nsSysteme.h" using namespace std; using namespace nsSysteme; namespace { volatile sig_atomic_t Fin = 0; volatile sig_atomic_t Saisie = 0; typedef vector CVInt; CVInt V; void Affich (void) { cout << "Vecteur trié : " << endl; for (CVInt::size_type i = 0; i < V.size(); ++i) { cout << setw (5) << V [i] << flush; ::sleep (1); } cout << endl; } // Affich() void Derout (int NumSig) { Saisie |= SIGINT == NumSig; Fin |= SIGQUIT == NumSig; } // Derout() // On peut aussi utiliser 2 fonctions distinctes : ASaisir() et AFinir() } // namespace anonyme int main(int argc, char * argv []) { try { if (argc != 1) throw CExc("main()",string ("Usage : ") + argv [0]); V.push_back ( 0); V.push_back (10); V.push_back (20); Signal (SIGINT, Derout); Signal (SIGQUIT, Derout); Signal (SIGTSTP, Derout); sigset_t Masque, MasqueVide; ::sigemptyset (&Masque); ::sigemptyset (&MasqueVide); ::sigaddset (&Masque, SIGINT); ::sigaddset (&Masque, SIGQUIT); Sigprocmask (SIG_BLOCK, &Masque, 0); for ( ; !Fin; ) { while(!Saisie && !Fin) { cout << "Patience..,\n"; ::sigsuspend(&MasqueVide); // sans cette fonction, on aurait ecrit // Sigprocmask (SIG_UNBLOCK, &Masque, 0);if(!Saisie && !Fin) pause(); // mais ceci peut bloquer a l'infini justement si le signal arrive juste avant // l'appel de pause() cout << "Alors ?\n"; } if (!Saisie) continue; // et on sortira, car alors c'est forcement Fin // car on est sorti du while, donc !Fin est faux (et donc Fin est vrai). Saisie = false; cout << "Tapez un entier : "; int IntLu; cin >> IntLu; Sigprocmask (SIG_UNBLOCK, &Masque, 0); V.push_back (IntLu); sort (V.begin(), V.end()); Sigprocmask (SIG_BLOCK, &Masque, 0); Affich (); } return 0; } catch (const CExc & Exc) { cerr <