Signal pour l'appel systeme pause en C
lillyz
Messages postés
16
Date d'inscription
Statut
Membre
Dernière intervention
-
lillyz Messages postés 16 Date d'inscription Statut Membre Dernière intervention -
lillyz Messages postés 16 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j'ai un exemple de programme pour l'utilisation des signaux que je ne comprend pas complétement,
Pouvez-vous m'aider svp??
voilà mon programme
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
static void action (sig)
{
switch (sig) {
case SIGUSR1:
printf("Signal SIGUSR1 reçu par %d \n",getpid());
break;
case SIGUSR2:
printf("Signal SIGUSR2 reçu par %d \n",getpid());
break;
default:
break;
}
}
int main ()
{
int i, pid, etat;
// spécification de l'action du signal
if(signal(SIGUSR1,action)== SIG_ERR)
printf("Erreur de traitement du code de l'action 1 \n");
if(signal(SIGUSR2,action)== SIG_ERR)
printf("Erreur de traitement du code de l'action 2 \n");
printf("pid %d \n",getpid());
if((pid=fork())==0)
{
kill(getpid(),SIGUSR1); //envoyer un signal au parent
for(;;)
pause(); //Mise en attente d'un signal
//ici je souhaite visualiser la fin de pause et j'ai ajouté un printf
printf("ici process fils,fin de pause\n");
}
else
{
kill(pid,SIGUSR2);//Envoyer un signal à l'enfant
pause(); //Mise en attente d'un signal
printf("Parent: terminaison du fils\n");
kill(pid,SIGTERM);//Signal de terminaison à l'enfant
wait(&etat);//attente de fin de l'enfant
printf("Parent:fils termine\n");
}
return 0;
}
en l'executant j'ai le résultat suivant:
pid 290
Signal SIGUSR2 reçu par 290
Signal SIGUSR1 reçu par 291
et il se met en attente d'un signal...
je viens de commencer mon chapitre sur les signaux et je ne sais pas comment faire pour envoyer un signal par clavier à mon programme pour terminer l'execution
ctrl+c me termine le programme sans rien afficher par la suite
ctrl+z m'affiche stopped et le termine
donc j'ai pensé à envoyé un signal à partir d'une autre fenêtre de terminal:
et j'ai fais le teste avec les 2 num de pid (père et fils):
kill 290 --> m'affiche "Terminated"
kill 291 --> m'affiche "Parent: terminaison du fils
Parent:fils termine"
j'ai un ajouté un printf das le programme dans la partie execute par le fils
printf("ici process fils, fin de pause\n"); mais ne s'affiche pas prq??
et cmt envoyer un signal par clavier sans utilisé une seconde fenetre de terminal??
je sais que mon msg est trop long merci d'avance pour votre aide!! :D
j'ai les exams qui approchent :S
j'ai un exemple de programme pour l'utilisation des signaux que je ne comprend pas complétement,
Pouvez-vous m'aider svp??
voilà mon programme
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
static void action (sig)
{
switch (sig) {
case SIGUSR1:
printf("Signal SIGUSR1 reçu par %d \n",getpid());
break;
case SIGUSR2:
printf("Signal SIGUSR2 reçu par %d \n",getpid());
break;
default:
break;
}
}
int main ()
{
int i, pid, etat;
// spécification de l'action du signal
if(signal(SIGUSR1,action)== SIG_ERR)
printf("Erreur de traitement du code de l'action 1 \n");
if(signal(SIGUSR2,action)== SIG_ERR)
printf("Erreur de traitement du code de l'action 2 \n");
printf("pid %d \n",getpid());
if((pid=fork())==0)
{
kill(getpid(),SIGUSR1); //envoyer un signal au parent
for(;;)
pause(); //Mise en attente d'un signal
//ici je souhaite visualiser la fin de pause et j'ai ajouté un printf
printf("ici process fils,fin de pause\n");
}
else
{
kill(pid,SIGUSR2);//Envoyer un signal à l'enfant
pause(); //Mise en attente d'un signal
printf("Parent: terminaison du fils\n");
kill(pid,SIGTERM);//Signal de terminaison à l'enfant
wait(&etat);//attente de fin de l'enfant
printf("Parent:fils termine\n");
}
return 0;
}
en l'executant j'ai le résultat suivant:
pid 290
Signal SIGUSR2 reçu par 290
Signal SIGUSR1 reçu par 291
et il se met en attente d'un signal...
je viens de commencer mon chapitre sur les signaux et je ne sais pas comment faire pour envoyer un signal par clavier à mon programme pour terminer l'execution
ctrl+c me termine le programme sans rien afficher par la suite
ctrl+z m'affiche stopped et le termine
donc j'ai pensé à envoyé un signal à partir d'une autre fenêtre de terminal:
et j'ai fais le teste avec les 2 num de pid (père et fils):
kill 290 --> m'affiche "Terminated"
kill 291 --> m'affiche "Parent: terminaison du fils
Parent:fils termine"
j'ai un ajouté un printf das le programme dans la partie execute par le fils
printf("ici process fils, fin de pause\n"); mais ne s'affiche pas prq??
et cmt envoyer un signal par clavier sans utilisé une seconde fenetre de terminal??
je sais que mon msg est trop long merci d'avance pour votre aide!! :D
j'ai les exams qui approchent :S
5 réponses
Salut.
Déjà, je trouve que ton message est pas mal, au moins il est clair et complet.
Je ne m'y connais pas trop en signaux, mais il me semble que ta boucle sur le "pause()" est infini non ? c'est pour ça que printf("ici process fils, fin de pause\n"); ne s'affiche pas.
Normalement avec kill tu peux envoyer différents types de signaux dans la console (man kill)
kill(getpid(),SIGUSR1); //envoyer un signal au parent envoi un signal à l'enfant (d'où 291)
il faut sauver la valeur du getpid du parent pour lui envoyer un message.
Déjà, je trouve que ton message est pas mal, au moins il est clair et complet.
Je ne m'y connais pas trop en signaux, mais il me semble que ta boucle sur le "pause()" est infini non ? c'est pour ça que printf("ici process fils, fin de pause\n"); ne s'affiche pas.
Normalement avec kill tu peux envoyer différents types de signaux dans la console (man kill)
kill(getpid(),SIGUSR1); //envoyer un signal au parent envoi un signal à l'enfant (d'où 291)
il faut sauver la valeur du getpid du parent pour lui envoyer un message.
Bonjour Char Snipeur et merci pour ta réponse,
en effet après quelques test j'ai trouvé la réponse à ce que je cherchais je publie la solution pour une autre personne
1) Pour envoyer un signal à un process il ya 2 méthodes:
kill(pid_t pid, int sig); //à partir d'un prog en c
kill -sig pid // à partir du terminal linux
2) Les signaux que j'envoyais à mes process leur demandais de quitter et ce la explique prq mon printf("ici process fils, fin de pause\n"); ne s'affiche jamais et que quand jenvoi un signal au père l'execution de mon programme ne se termine pas.
en effet après quelques test j'ai trouvé la réponse à ce que je cherchais je publie la solution pour une autre personne
1) Pour envoyer un signal à un process il ya 2 méthodes:
kill(pid_t pid, int sig); //à partir d'un prog en c
kill -sig pid // à partir du terminal linux
2) Les signaux que j'envoyais à mes process leur demandais de quitter et ce la explique prq mon printf("ici process fils, fin de pause\n"); ne s'affiche jamais et que quand jenvoi un signal au père l'execution de mon programme ne se termine pas.
Et dans ce cas quel signal doit on envoyé pour stoppé une pause ? j'ai essayé sigcont mais sa ne fonctionne pas
Bonjour,
il y a une boucle infinie avant le printf alors il vous faut trouver le moyen de récupérer le signal du clavier dans la boucle et en sortir lors du signal clavier avec un break pour que le printf soit lu
exemple :
il y a une boucle infinie avant le printf alors il vous faut trouver le moyen de récupérer le signal du clavier dans la boucle et en sortir lors du signal clavier avec un break pour que le printf soit lu
exemple :
for(;;) { pause(); if(signal_clavier) { break; } } printf("ici process fils,fin de pause\n");
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question