int bor_signal (int sig, void (*h)(int), int options)
{
struct sigaction s;
s.sa_handler = h;
sigemptyset (&s.sa_mask);
s.sa_flags = options;
return sigaction (sig, &s, NULL);
}
void capte(int sig, int pid)
{
switch(sig) {
case SIGUSR1 : kill(pid, sig);
printf("signaux recu, renvoi vers %d\n",pid); break;
}
return;
}
int main()
{
int p1, p2;
p1=fork();
if(p1<0) { perror("fork"); exit(1); }
if(p1==0)
{
printf("le fils 1 est %d\n", getpid());
capte(SIGUSR1, getppid());
exit(0);
}
p2=fork();
if(p2<0) { perror("fork"); exit(1); }
if(p2==0)
{
printf("le fils 2 est %d\n", getpid());
kill(p1,SIGUSR1);
capte(SIGUSR1, p1);
exit(0);
}
printf("le pere est %d\n", getpid());
capte(SIGUSR1, p2);
sleep(10);
return 0;
}
mais ça ne fonctionne pas, tandis que si j'enleve le kill() dans la
fonction capte le pere et le fils 2 vont recevoir un signal alors que
je ne leur envoie rien...
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 5 févr. 2008 à 16:23
Salut,
Tiens, ça compile pas.
Tiens ça compile si je vire -Wall -ansi -pedantic
Erf...
Comment dire...
Pour capter un signal, il faut dire à Linux : "Hé garçon, quand mon appli reçoit ce signal, merci d'appeler cette fonction !".
Pour demander ça à Linux, il faut utiliser la fonction signal.
Dans une invite, tape man 2 signal ou man 2 kill pour plus d'info.
Voilà ce que ça me donne, à condition que j'ai compris l'énoncé...
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int p1; // Pid du fils 1
int p2; // Pid du fils 2
int fils_courant = 2; // Dernier fils à qui ont a envoyé le signal
int counter = 10; // Passe à 0 quand il faut arrêter le programme
void pere_signal_handler(int a)
{
counter -= 1;
sleep(2);
if (fils_courant == 2)
{
printf("Le pere envoie le signal au fils 1\n");
kill(p1, SIGUSR1);
fils_courant = 1;
}
else
{
printf("Le pere envoie le signal au fils 2\n");
kill(p2, SIGUSR1);
fils_courant = 2;
}
}
void fils_signal_handler(int a)
{
printf("Le fils %d renvoie le signal au pere\n", getpid());
kill(getppid(), SIGUSR1);
}
int main()
{
printf("le pere est %d\n", getpid());
// Mise en place du handler du père
signal(SIGUSR1, pere_signal_handler);
p1=fork();
if(p1<0) { perror("fork"); exit(1); }
if(p1==0)
{
printf("le fils 1 est %d\n", getpid());
signal(SIGUSR1, fils_signal_handler);
while (1);
}
p2=fork();
if(p2<0) { perror("fork"); exit(1); }
if(p2==0)
{
printf("le fils 2 est %d\n", getpid());
signal(SIGUSR1, fils_signal_handler);
while (1);
}
// On force le premier envoie
pere_signal_handler(0);
while (counter);
kill(p1, SIGKILL);
kill(p2, SIGKILL);