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

C Discussion :

pere/fils


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Points : 60
    Points
    60
    Par défaut pere/fils
    bonjour tout le monde,

    j'ai vraiment un petit problème ... je sais pas c'est peut être la fatigue ou quoi mais bon

    voilà donc je crée un fils qui veut envoyer un signal à son père qui doit l'intercepter ... mais celà ne fonctionne pas .. et lorsque j'affiche les pid des pere et fils il me semble que le pid du fils devrait être nul mais c pas le cas c bizarre

    si vous pouviez m'éclairer ce serait cool . voici le code
    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
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <signal.h>
     
     
     
     
    void recoit()
    {
    	printf(":: pere :: signal reçu\n") ;
    }
     
     
    int main()
    {
    	int fils;
     
    	if ((fils=fork())==-1)
    	perror("erreur création fils") ;
    	int pere =getpid() ;
     
    	if (fils == 0)
    	{
    		//fils
    		printf("fils %d\n", getpid() ) ;
     
     
    		kill(pere, SIGUSR1) ;
     
     
     
    		exit(0) ;
    	}
    	else
    	{
    		//père
    		printf("père %d\n", getpid()) ;
    		struct sigaction sa ;
    		sigemptyset(&sa.sa_mask) ;
    		sa.sa_handler = recoit ;
    		sa.sa_flags = 0 ;
     
    		while(1)
    		{
    			sigaction(SIGUSR1, &sa, NULL) ;	
    		}	
    		exit(0) ;
    	}
     
    }

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Le pid du fils n'est pas nul si t'appelles getpid... Le retour du fork vaudra 0 pour le fils...

    EDIT: pour le fait que cela ne fonctionne pas est parce que la signature de la fonction recoit doit être

    Mais ce n'est pas dans une boucle que l'appel à sigaction doit être mis... Il faut le mettre avant la boucle. Par contre, attention, rien ne promet que l'appel à sigaction du père sera fait avant le kill du fils...

    Pour être sûr, il faudrait mettre cet appel avant le fork...

    Jc

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Points : 60
    Points
    60
    Par défaut
    daccord .... mais l'interception du signal de fonctionne quand même pas ...

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(1) 
          { 
             sigaction(SIGUSR1, &sa, NULL) ;    
          }    
          exit(0) ;
    ligoté comme ça le programme boucle indéfiniment.
    Rien ne prouve qu'on puisse sortir

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Points : 60
    Points
    60
    Par défaut
    là n'est pas le problème l'objectif est dailleurs que ça boucle indéfiniement pour que l'on puisse voir le nombre de message échangé pendant une période ...

    j'ai mis mon code à jour :
    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
    64
     
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <signal.h>
     
     
     
     
    void recoit()
    {
    	printf(":: pere :: signal reçu\n") ;
    }
     
     
    int main()
    {
    	int fils;
     
    	if ((fils=fork())==-1)
    	perror("erreur création fils") ;
    	int pere =getpid() ;
     
    	if (fils == 0)
    	{
    		//fils
    		printf("fils %d \n", getpid() ) ;	
    		while(1)
    		{
    			if (kill(pere, SIGUSR1)==-1)
    			{	perror("motha fuck that bitch") ;
    				exit(-1) ;
    			}	
    		}	
    		exit(0) ;
    	}
    	else 
    	{
    		//père
    		printf("père %d %d\n", getpid(), pere) ;
    		struct sigaction sa ;
    		sigemptyset(&sa.sa_mask) ;
    		sa.sa_handler = recoit ;
    		sa.sa_flags = 0 ;
     
    		while(1)
    		{
    			if(sigaction(SIGUSR1, &sa, 0)==-1)
    			{
    				perror("bouh");
    				exit(-1) ;
    			}	
     
    			if(sigaction(SIGUSR2, &sa, 0)==-1)
    			{
    				perror("bouh");
    				exit(-1) ;
    			}
     
    		}	
    		exit(1) ;
    	}
     
    }

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ce n'est pas
    int pere =getpid() ;
    mais
    fork(), comme son nom l'indique, dédoublonne le processus courant, retournant le pid du processus enfant dans le contexte du processus parent et 0 dans le contexte du processus enfant.
    Le processus enfant peut néanmoins obtenir le pid de son processus parent avec getppid() (get parent pid).
    Boost ftw

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Points : 60
    Points
    60
    Par défaut
    oui j'avais rectifié ... celà ne fonctionne toujours pas

    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
    	if ((fils=fork())==-1)
    	perror("erreur création fils") ;
     
     
     
    	if (fils==0)
    	{
     
    		//fils
    		printf("fils %d\n", getpid()  ) ;	
     
    		int pere =getppid() ;
     
    			if (kill(pere, SIGUSR1)==-1)
    			{	perror("erreur kill") ;
    				exit(-1) ;
    			}	
     
    		exit(0) ;
    	}

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    J'ai utilisé signal à la place de sigaction car c'est plus simple et dans ton cas tu n'as pas besoin de sigaction.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <signal.h>
     
    void recoit(int sig)
    {
       printf(":: pere :: signal reçu\n") ;
    }
     
     
    int main()
    {
    	pid_t fils, pere;
     
    	if(signal(SIGUSR1, recoit) == SIG_ERR)
    	{
    		perror("bouh");
    		return EXIT_FAILURE;
    	}
     
    	if(signal(SIGUSR2, recoit) == SIG_ERR)
    	{
    		perror("bouh");
    		return EXIT_FAILURE;
    	}
     
    	fils = fork();
    	if(fils < 0)
    	{
    		perror("erreur création fils") ;
    		return EXIT_FAILURE;
    	}
     
    	if(!fils)
    	{
    		pere = getppid();
    		printf("pid du fils : %d\n", getpid());
    		while(1)
    		{
    			if(kill(pere, SIGUSR1) < 0)
    			{
    				perror("impossible d'envoyer le signal") ;
    				return EXIT_FAILURE;
    			}
    		}
    	}
    	else
    	{
    		printf("pid du père : %d\n", getpid());
    		while(1);
    	}
    }
    Boost ftw

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Points : 60
    Points
    60
    Par défaut
    okay ... j'ai réussi à voir ou était le probleme ... j'ai simplement rajouté un sleep(1) avant que le fils envoi le message .... le fils envoyait le signal avant que le pere débute .. merci a tous 8)

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    "avant que le père débute" !???
    Le père débute avant le fils, par définition.
    Boost ftw

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par innosang
    okay ... j'ai réussi à voir ou était le probleme ... j'ai simplement rajouté un sleep(1) avant que le fils envoi le message .... le fils envoyait le signal avant que le pere débute .. merci a tous 8)
    D'où le fait que j'avais dit ceci:
    Mais ce n'est pas dans une boucle que l'appel à sigaction doit être mis... Il faut le mettre avant la boucle. Par contre, attention, rien ne promet que l'appel à sigaction du père sera fait avant le kill du fils...

    Pour être sûr, il faudrait mettre cet appel avant le fork...
    Mais attention, rien ne promet qu'un sleep suffira... Il se peut très bien que le système fasse tourner d'autres processus et reprenne le fils après le sleep...

    Improbable, oui mais possible...

    Pense au

    Jc

Discussions similaires

  1. DataGrid relation pere/fils
    Par TheBlackReverand dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/01/2007, 18h08
  2. [SQL server 2005] Problème de tris avec notion Père-Fils
    Par pedrover dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/12/2006, 16h43
  3. Communication pere/fils dans un serveur
    Par romainromain dans le forum Réseau
    Réponses: 4
    Dernier message: 22/11/2006, 19h47
  4. synchronisation processus pere fils
    Par Tex-Twil dans le forum POSIX
    Réponses: 6
    Dernier message: 25/10/2006, 11h34
  5. modeliser relation pere fil
    Par flawer dans le forum Débuter
    Réponses: 20
    Dernier message: 12/12/2005, 11h59

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