Signaux

Signaler
Messages postés
105
Date d'inscription
samedi 25 janvier 2003
Statut
Membre
Dernière intervention
13 décembre 2008
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour je dois faire un programme qui crée 2 fils, envoie SIGUSR1 au fils 1, qui le renvoie au pere, qui le renvoie au fils 2 etc..

j'ai tenté ça mais ça ne fonctionne pas

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

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...

1 réponse

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
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);

return 0;
}