Salut,
Dans le cadre d'un TP, je dois écrire un code correspondant aux consignes suivantes :
"Le programme doit créer un ensemble de processus de calculs jusqu'à remplir la table des processus. La machine sera "gluée" lorsque l'appel à fork
échouera (le système ne pouvant plus créer de nouveau processus). Le programme doit afficher le nombre de processus créés, attend une saisie-clavier et détruit tous les processus de calcul. Les processus de calcul doivent appartenir à un même groupe de processus pour faciliter leur destruction."
Ma solution
Pour saturer la table des processus, j'ai créé une boucle while(fork() != -1)
. Puis dans chaque processus-enfant, qui effectue comme calcul l'incrémentation d'une variable (i
), je boucle à l'infini et je ne fait aucun exit
ou return
(je me situe dans le main
) : ainsi aucun processus-enfant ne meurt de lui-même et ça permet de saturer la table des processus du système.
Le processus-père, quant à lui, incrémente une variable number_of_children_processes
à chaque appel à fork
. Quand le système ne peut plus créer de processus-fils (fork() == -1
), on laisse l'utilisateur-final taper "ENTREE". Si c'est le cas, on termine tous les processus dont le groupe est le même que celui du parent.
Problèmes
Clairement je vois deux soucis :
-
Le fait que les processus-enfants bouclent à l'infini me force à redémarrer le système (Linux sous VirtualBox sous Windows) et ce n'est pas normal…
-
Toujours à cause de ces boucles infinies, le
scanf
du processus-père serait noyé par d'éventuels affichages des processus-fils (bon ce n'est pas demandé dans mon TP mais ça pourrait être un souci s'il devait y en avoir).
Voilà du coup je crois que ma solution est pour le moins bancale, puisque je dois redémarrer mon KUbuntu chaque fois que j'exécute mon programme… Je m'y suis mal pris et je voulais savoir si quelqu'un savait comment faire ?
Merci d'avance !
Source
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> int main(int argc, char* argv[]) { int pid = 0; int number_of_created_child_processes = 0; while((pid = fork()) != -1) { if(pid != 0) { number_of_created_child_processes++; } else { int i = 0; while(1) { i++; } } } // NOW it's impossible to create new processes children perror("Fork"); char cmd = 0; scanf("%c", &cmd); if(cmd == '\n') { kill(0, SIGKILL); } while(wait(NULL) > 0) {;;} exit(EXIT_SUCCESS); } |