Signal pour l'appel systeme pause en C

Fermé
lillyz Messages postés 16 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 2 avril 2013 - Modifié par lillyz le 6/01/2011 à 13:42
lillyz Messages postés 16 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 2 avril 2013 - 28 janv. 2011 à 15:02
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

5 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
6 janv. 2011 à 14:56
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.
0
lillyz Messages postés 16 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 2 avril 2013
7 janv. 2011 à 15:24
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.
0
Et dans ce cas quel signal doit on envoyé pour stoppé une pause ? j'ai essayé sigcont mais sa ne fonctionne pas
0
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 :

for(;;) {
    pause();
    if(signal_clavier) { break; }
}
printf("ici process fils,fin de pause\n"); 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lillyz Messages postés 16 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 2 avril 2013
28 janv. 2011 à 15:02
ca ne fonctionnera pas avec SIGCONT parceque ce lui là continue un processus stopé
tu peux envoyé n'importe quel autre signal SIGUSR1, SIGUSR2, SIGTERM. SIGSTOP.....
Ou tu fais tout simplement: kill pid
0