Partage
  • Partager sur Facebook
  • Partager sur Twitter

signaux entre procesus

    29 mars 2022 à 17:19:44

    Bonjour! , j'ai un exercice que mon prof m'a donné voici, l’énoncé:

    La fonction C kill(…,…) est l'équivalent de la commande shell kill. Réalisez un programme qui après s'être dupliqué réalise les actions suivantes:

    • Le père se met en attente de la réception su signal SIGUSR1 et affiche le PID de son fils lorqu'il l'a reçu;
    • Le fils envoie un signal SIGUSR1 à son père.

    Pour que cela fonctionne, il faut que le père s'exécute en premier. Utilisez sleep() pour endormir le fils pendant 5 secondes ce qui devrait permettre au père de commencer. Pour mettre en attente le père jusqu'à réception d'un signal, utilisez la fonction pause().

    le problème c'est que mon programme me retourne le message suivant  'signal #1 défini par l'usager' et je ne sais pas pourquoi. Voici mon code

    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/types.h>
    
    
    int main(void){
    
    		
    	pid_t pid;	
    	pid=fork();	
    	
    	if(pid==0){ // si pid==0 alors on est dans le fils 
    		sleep(5);		
    		kill(getppid(),SIGUSR1);
    		
    		}
    	else { // pid>0 on est dans le père, et on a le pid du fils 
    		pause();
    		printf("\nle pid de mon fils est %d\n",pid);
    	}
    
    }



    • Partager sur Facebook
    • Partager sur Twitter
      29 mars 2022 à 17:46:08

      Yo,

      Le message que tu vois s'afficher c'est un printf (ou équivalent hein) qui se trouve dans la fonction handler par défaut du signal SIGUSR1.

      C'est à dire que lorsque ton programme reçoit un signal, il execute une fonction dite "handler".
      Si tu ne changes pas les handler, ce sont ceux par défaut qui seront executés.

      Par exemple en gros SIGINT (ctrl+C) ferme le programme, SIGSEGV (segfault) aussi ferme le programme ... mais tu pourrais changer cela pour que le programme continue meme si il recǫit un ctrl+C.
      Pour changer le handler tu as la fonction sigaction().

      • Partager sur Facebook
      • Partager sur Twitter
        30 mars 2022 à 10:10:04

        C'est normal car tu ne gères pas SIGUSR1 et donc l'action par défaut est de terminer le processus.

        pause c'est bien mais ça attend juste un signal quelconque, il va aussi falloir gérer lequel t'intéresse (si par exemple l'exercice est de se stopper uniquement sur SIGUSR1). On peut utiliser sigaction mais c'est asynchrone (sans parler des autres aléas que sont les signaux) ou simplement sigwait pour bloquer sans utiliser pause.

        -
        Edité par markand 30 mars 2022 à 10:13:50

        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

        signaux entre procesus

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown