IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Pourquoi le 1er fils ne reçoit pas le signal envoyé par le père


Sujet :

Linux

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 49
    Points : 49
    Points
    49
    Par défaut Pourquoi le 1er fils ne reçoit pas le signal envoyé par le père
    Bonjour,

    J'ai un programme qui crée un fils et enregistre son pid, puis crée un 2eme fils.

    Une fois tous le monde créée, le dernier fils envoie un signal au père, ce dernier envoie alors un signal au premier fils. mais le premier fils ne le reçoit pas.

    [edit] pour ceux qui aurait lu mon 1er message le code a été simplifié avec un père et 2 processus fils [/edit]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    # include <stdio.h>
    # include <stdlib.h>
    # include <unistd.h>
    # include <sys/types.h>
    # include <sys/wait.h>
    # include <sys/stat.h>
    # include <fcntl.h>
    # include <time.h>
    # include <signal.h>
    # include <sys/mman.h>
     
    static pid_t* pidt;
     
    // handler signal père
    void sig_handler(int signo)
    {	
      if (signo == SIGUSR1) {
      	printf("SIG HANDLER received SIGUSR1 by process %d\n", getpid());
      	printf("-> Envoie du signal SIGUSR1 au fils %d\n", pidt[0]);
      	// le père envoie un signal au premier fils
    	kill(pidt[0], SIGUSR1);
      }
     
    }
    // handler signal fils
    void sig_handlerr(int signo)
    {	
      if (signo == SIGUSR1) {
      	printf("SIG HANDLER2 received SIGUSR1 by process %d\n", getpid());
      }
     
    }
     
    int main(int argc, char* argv[]) {
     
    	printf("pid du processus père %d\n", getpid());
     
    	pidt = mmap(NULL, sizeof(pid_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
     
    	if (fork()==0) {	
    		printf("1 processus fils %d\n", getpid());
    		pidt[0]=getpid();
    		printf("pid enregistré= %d\n", pidt[0]);
    		signal(SIGUSR1, sig_handlerr);
    		exit(0);
    	}
    	wait(NULL); 
     
    	signal(SIGUSR1, sig_handler);
     
    	if (fork()==0) {
    		printf("2 processus fils %d", getpid());
     
    		// il envoie un signal SIGUSR1 au processsu père
    		printf("-> envoie SIGUSR1 au père %d\n", getppid());
    		kill(getppid(), SIGUSR1); // envoie un signal SIGUSR1 au processus père
    		exit(0);
    	}
    	wait(NULL);
     
    	printf("\n\n------ Fin du programme -------");
    	return EXIT_SUCCESS;
    }
    pourquoi le premier fils ne reçoit pas le signal envoyé par le père ?

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 919
    Points : 220 492
    Points
    220 492
    Billets dans le blog
    127
    Par défaut
    Bonjour,

    Etes vous certain que le premier fils est encore vivant (pas de wait() avant le exit()) ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 28
    Points
    28
    Par défaut
    car tu a exit(0); le premier fils dans ton premier fork
    et que tu ne fais pas de kill() avant de tuer le premier fils,
    n'émettant pas de signal il est normal que le pere n'en reçoive pas

Discussions similaires

  1. [PDO] Page PHP / PDO ne reçoit pas les variables passées par la page précédente
    Par notebleue dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/03/2017, 12h58
  2. [MySQL] Mon client ne reçoit pas les courriels envoyés par mon formulaire (mais moi oui)
    Par carogilb19 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 16/08/2012, 20h09
  3. Pourquoi n'y à t'il pas de rubrique Windev sur www.developpez.com ?
    Par TicTacToe dans le forum Evolutions du club
    Réponses: 12
    Dernier message: 21/04/2006, 18h44
  4. Pourquoi rand()%N n'est il pas équiprobable?
    Par Pragmateek dans le forum C++
    Réponses: 12
    Dernier message: 23/03/2006, 00h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo