Tous les documents de cette page sont sous licence Creative Commons BY-NC-SA . Merci de la respecter. ©A. Dragut |
tar cvf - exo_01 | gzip -9 - > exo_01.tar.gzAttention aux espaces autour des tirets seuls, ces tirets demandent l'utilisation de l'entrée, respectivement sortie standard (au lieu d'utiliser des noms de fichiers). Ainsi on peut enchaîner ces commandes et tout déposer directement dans exo_01.tar.gz Par contre, le -9 est bien ensemble, cette option demande la meilleure compression.
killall -ALRM ./exo_01.run |
ps -leaf | grep ' Z ' |
| || || | |..._|__|__||__|__|__|__|__|__|__|__||__|__|__|__|__|__|__|__| .....17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ^^^^^^^^^^^^^^^^^^^^^^^^^ octet qui nous intéresse |
| || || | |...0|_0|_0||_0|_0|_0|_0|_0|_0|_0|_0||__|__|__|__|__|__|__|__| .....17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ^^^^^^^^^^^^^^^^^^^^^^^^^ tous les autres bits sont NULS octet qui nous intéresse |
status >> 8Ce n'est tout de même pas suffisant, car il faut rendre nuls TOUS LES AUTRES BITS de status (qui peut en avoir par exemple 32!), afin d'obtenir donc un nombre entre zéro et 255. En général, pour rendre nuls certains bits et garder d'autres tels quels, on fait un ET binaire entre status et un nombre spécialement construit, qu'on appelle un masque binaire. Les bits zéro du masque, suite au ET binaire, font que le résultat final ait CES BITS également nuls, tandis que les bits non-nuls du masque CONSERVENT en l'état les bits correspondants du status.
| || || | |...0|_0|_0||_0|_0|_0|_0|_0|_0|_0|_0||_1|_1|_1|_1|_1|_1|_1|_1| = 255 = 0xFF .....17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ^^^^^^^^^^^^^^^^^^^^^^^^^ tous les autres bits sont NULS tous ces bits sont non-nuls |
#define NOM(PARAMETRE) CORPSavec PARAMETRE apparaissant bien entendu dans le CORPS.
#define maMacro(a) ((a) < 0 ? - (a) : (a))va définir une telle macro, et un programme contenant la ligne
... cout << "Valeur absolue " << maMacro(x+y) << "\n"; ...lors d'une invocation g++ ..., sera TRANSFORMÉ par le préprocesseur en le programme
... cout << "Valeur absolue " << ((x+y) < 0 ? - (x+y) : (x+y)) << "\n"; ...AVANT que le compilateur commence son travail dessus. Bien entendu, TOUS les endroits ou apparaît maMacro(quelqueChose) vont être ainsi transformés. On comprend aisément la raison de l'abondance de paranthèses dans la définition de la macro -- sinon le compilateur se plaint d'erreurs de syntaxe ou autres, bien difficiles à réparer. Ce remplacement effectué par le préprocesseur est purement syntaxique (pas de vérification de type, comme entier, double, etc. ni de consistance, etc.
GETSTATUS(status) ((status)>>8) & 0xff
if (3 > argc) throw CExc ("main()",string ("Usage : ") + argv [0] + " <nbrFils (entre 1 et 20)> <sleepSecondesFils1> <sleepSecondesFils2> ..."); qIlYADesFilsTermines = 0; const int CstNbrFils = atoi (argv [1]); if (CstNbrFils < 1 || CstNbrFils > 20) throw CExc ("main()","Nombre de fils non compris entre 1 et 20"); if(argc != CstNbrFils + 2) { throw CExc ("main()",string ("Usage : ") + argv [0] + " <nbrFils (entre 1 et 20)> <sleepSecondesFils1> <sleepSecondesFils2> ...");
::pid_t TabPid [CstNbrFils]; ::pid_t TabEtat [CstNbrFils];
for(int ilYAEncoreAutantDeFils (CstNbrFils); ilYAEncoreAutantDeFils;) { cout << "En attente, car il me reste " << ilYAEncoreAutantDeFils << " fils...\n"; ::sigsuspend(&MasqueUnBlock); if(!qIlYADesFilsTermines) { continue; } qIlYADesFilsTermines = 0; for(int kFils(0); kFils < CstNbrFils; kFils++) { int status; if(0 == TabEtat[kFils]) { continue; } cout << "Recuperation du status fils " << TabPid[kFils] << " ... ";
execl(..., static_cast<char *>(0));Explication: Les pointeurs peuvent être sur 64 bits, tandis que les entiers restent sur 32. L'absence de cette conversion entraîne l'erreur de compilation "missing sentinel").
http://www.kernel.org/doc/man_pagesLe drapeau est utilisable pour un kernel/noyau Linux > 2.6.23 et un glibc >2.7 . Sinon on peut positionner le drapeau "fermé-en-exec" après l'ouverture d'un fichier avec le drapeau/flag F_SETFD de la fonction fcntl() et la valeur FD_CLOEXEC
premierMot = strtok(chaineAdecomposer, Separateurs);et puis l'appeler obligatoirement ainsi
autreMot = strtok(0, Separateurs);c'est-à-dire avec zéro pour son premier paramètre.
© A. B. Dragut
dragut@univmed.fr
I.U.T.d'Aix en Provence - Département Informatique