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
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 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 GTK+-2.0, saisie d'un int ! [ par zazar ] G me demande si la réalisation d'une fonction retournant un int qu'un utilisateur à rentré par le biais d'une fenetre nécessite forcément une conversi Fch. Header :: CONIO.H [ par TontOnDuWeb ] Pour ce que ca interesse (avec vc++ les fonctions suivantes e sont pas incluse (du moins je crois...))>>#if !defined(__CONIO_H)#define __CONIO_H#if !d Convertion "15"(string) --> 15(int) [ par crocejf2000 ] (Re)SalutIl faut que je test ma chaine et que je la convertisse si je peut. Avec atoi("12"), ca me donne bien 12, mais si je fait un atoi("12hach"), c Comprendre les constructeurs ! [ par MichelAliasMiB ] Bonjour, Merci de vous arreter :-) Je suis présentement une formation en C++, et j'aimerais comprendre quelque chose qui n'est pas clair dans mon bouq convertir un int en char ou en string [ par mimyne ] Bonjour je voudrai savoir comment on peut faire en c++ pour convertir un int en char ou bien en string la fonction itoa ne marche pas merci


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

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



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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,406 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é.