Bonjour à tous!
Dans la cadre de mes exercices de système en C sur le chapitre des communications inter-processus, il m'est demandé de gérer la création et la suppression des processus tout en pouvant consulter la liste des process actuels donc un petit:
permet de consulter mes processus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if(fork() == 0) execlp("ps","ps",0); wait();
Si j'ai bien compris, cet exercice a pour but de me faire comprendre les signaux avec la fonction "kill( pid du process, SIGINT (ou SIGKILL)) et revisiter la fonction fork().
J'ai réalisé une version qui fait ce qui est demandé sous linux, mais je me pose des questions...
Pour créer des process je fais
ce qui me crée donc n process récursivement. Si je décide de quitter je dois le faire pour chaque fils créé:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void creerProcessus(short *n){ if(*n > 0 && fork() == 0){ *n -= 1; creerProcessus(n); } }
En fait je fais une boucle tant que ce n'est pas "q" qui est entré je propose de créer ou supprimer des processus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if(strcmp(ligne, "q\n")==0){ exit(0);
Puisqu'on est dans le chapitre qui parle entre autre des signaux, je me suis dis il faudra faire:
Sauf que le pid qui me permettrait de quitter le programme et laisser les fils en attente être adopté par le système, je ne sais pas comment le garder à ma portée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if(strcmp(ligne, "q\n")==0){ kill(pid,SIGINT);
J'ai bien essayé de faire
avant de commencer une quelconque création ou suppression de process. Mais lorsque je crée des procress, la contenu de pidPere est à 0!! Moi qui pensais que le fork() créait une image absolument identique au process père, à l'exception du numéro du processus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 pidPere = getpid(); printf("pidPere %d\n", pidPere); // est différent de 0
Ca fait donc un
est-ce propre? (moi je trouve pas) même si ca fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part kill(0,SIGINT);
Donc tout ça pour vous demandez qu'est ce qui pourrait m"échapper et si vous voyez une meilleur facon de faire je suis à votre écoute ??
J'espère que c'est assez clair sans rentrer dans les détails de mon travail. (Je précise que j'ai déjà fais des recherches)...
Merci
Partager