Créer des processus en C

Fermé
Scipion - 1 mai 2010 à 22:32
Urielxx Messages postés 190 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 25 juin 2013 - 2 mai 2010 à 13:59
Bonjour à tous,
Je dois créer un programme qui est régit par des signaux ainsi que deux processus (un père et un fils). Comme je n'ai aucune notion de comment créer des processus, je me suis renseigné et on m'a conseillé d'utiliser la fonction fork : http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/fork.2.html

Cependant quelque chose m'échappe, lorsque je créer plusieurs processus, comment puis-je savoir si je suis dans l'un ou dans l'autre ? Prennons l'exemple développé dans le man :

pid_t pid;
pid = fork ();
if (pid > 0) {
/* Processus père */
} else if (pid == 0) {
/* Processus fils */
} else {
/* Traitement d'erreur */
}

Comment puis-je savoir, modifier la valeur du pid (qui déterminera dans quel processus je suis) ?
A voir également:

3 réponses

Urielxx Messages postés 190 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 25 juin 2013 46
2 mai 2010 à 02:12
Tu ne peux pas modifier la valeur de pid. A partir de ton fork(), tu a deux instances de ton programme qui tournent en même temps : le père, et le fils.
Dans le fils, pid vaut 0, et dans le père, pid vaut le pid du fils. C'est la seul manière de différencier les deux.
0
Pour être plus précis voici mon code avec l'énoncé de l'exercice :

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>


/*
Écrivez un programme qui crée un fils.

Lorsque le fils reçoit le signal SIGTSTP (CTRL-Z), il affiche dans un fichier, dont le nom est passé comme premier argument au programme, la phrase ''C'est en forgeant''. De plus, lorsque le programme reçoit le signal SIGINT (CTRL-C), il affiche la phrase ''que l'on devient forgeron'' dans un fichier dont le nom est passé comme second argument au programme, puis il se termine.

Le père attend des commandes au clavier. Lorsqu'il reçoit une ligne contenant respectivement "SIGTSTP" ou "SINGINT", il envoie le signal correspondant à son fils. Dans les autres cas, il imprime son mode d'emploi.
*/

FILE* fichier = NULL;

void fils(int sig){
fputs("C'est en forgeant ", fichier);
}


void forgeron(int sig){
fputs("que l'on devient forgeron.", fichier);
fclose(fichier);
exit(0);
}

int main(int argc, char* argv []){

signal(SIGINT, forgeron);
char * tab = strcat(argv[1],".txt");
fichier = fopen(tab, "w");

pid_t pid;
pid = fork ();

/* On suppose qu'il n'y a pas de problèmes avec le fichier pour ne pas surcharger le code.
*/


while(1){
if (pid > 0) {
char * commandes;
char * SIGS = "SIGTSTP";
scanf("%s",commandes);

if(strcmp(commandes,SIGS)==0){
// Envoie un signal au fils
}

else{
// imprime son mode d'emploi.
}


} else if (pid == 0) {
signal(SIGTSTP, fils);
} else {
/* Traitement d'erreur */
}

}
return 0;
}


Deux choses m'échappent : comment le père peut-il envoyer le message au fils ? et comment imprimer le mode d'emploi d'un signal ?

D'habitude quand j'utilise des signaux, je mets un while(1) vide pour empêcher que le programme ne se termine. Cependant, ici dans ce while, j'ai pris les commandes pour les deux processus, je ne sais pas si cela est correct.
0
Urielxx Messages postés 190 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 25 juin 2013 46
2 mai 2010 à 13:59
SIGSTP est un signal qui ne peut pas etre trappé, donc il faut en prendre un autre (SIGUSR1 par ex).

On envoie un signal avec l'appel systeme kill . Le père peut envoyer un signal au fils car il dispose du PID du fils.

Lis la doc sur le sujet ici :
https://linux.die.net/man/2/signal
https://linux.die.net/man/2/kill


Par contre, tu devrais utilise une fonction fils() et pere() pour que ton code soit lisible. Le pere fait une boucle sur scanf(); le fils fait une boucle infinie (avec un sleep dedans c'est mieux), et ne se reveillera que sur reception d'un signal.
0