Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Signaux [ Linux / Réseau & Internet ] (manta7)

dimanche 3 février 2008 à 13:05:42 | Signaux

manta7

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

mardi 5 février 2008 à 16:23:25 | Re : Signaux

rt15

Membre Club Administrateur CodeS-SourceS
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;
}




Cette discussion est classé dans : int, p1, fils, sig, sigusr1


Répondre à ce message

Sujets en rapport avec ce message

New et Delete [ par Tyroflan ] juste une questionsi j'ai ceci : int *p1;...main(){int pipi;cin >> pipi;p1 = new int [pipi];...delete[pipi] p1; ou bien delete[] p1;}MAISje procède Communication entre pere et fils [ par anek971 ] Bonjour, Je dois actuellement codé un petit programma a priori simple sous linux. Il s'agit de faire un programme client serveur avec le client qui e Explication et correction de ce programme [ par bounkolh ] Bonjour, est ce que quelqu'un peut m'aider à expliquer et corriger ce programme svp? #include #include int main(int argc, char *argv[]) { int mon Heapsort [ par Striders77 ] Bonjour,Je dois programmer la fonction HEAPSORT en C et j'ai beacoup de mal avec l'algorythme. Si quelqu'un sait jeter un coup d'oeil...Merci d'avance un tableaux de permutation [ par sturnarbo ] /*Ecrire un programme qui range les éléments d'un tableau A du type int dansl'ordre inverse. Le programme utilisera des pointeurs P1 et P2 et une vari sturnarbo [ par sturnarbo ] ENONCE:/*Ecrire un programme qui range les éléments d'un tableau A du type int dansl'ordre inverse. Le programme utilisera des pointeurs P1 et P2 et u Les pointeurs [ par hicam2 ] J'ai se programme#include #include int main(){int * p1 =(int*)malloc(50*sizeof(int));int *p2 = p1;int i;for(i=1;i*(int*)(&p1-2)= 18 classe en c++ [ par katdeath ] bonsoir , je dois faire un exercice qui est le suivant : ecrivez une classe pile_entier permettant de gérer une pile d'entiers conservés dans un table les pipes [ par maciass ] slt svp est ce que qlq un peut m expliquer comment créer  un pipe(tube) pour faire communiquer deux processus père et fils (le père envoie une chaine programme triangle rectangle ou non [ par Phil974m ] j'ai un petit soucis avec mon programme qui ne gère pas correctement les données saisiej'ai fait un petit programme demandé dans mon bts iris qui cher


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.