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
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
A voir également:
- Créer des processus en C
- Créer un compte google - Guide
- Créer un compte gmail - Guide
- Comment créer un groupe whatsapp - Guide
- Créer un lien pour partager des photos - Guide
- Créer un compte instagram sur google - Guide
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
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.
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.
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.
#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.
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
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.
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.