Passage de parametres a une fonction [Résolu]

Signaler
Messages postés
19
Date d'inscription
jeudi 17 août 2006
Statut
Membre
Dernière intervention
4 février 2009
-
Messages postés
19
Date d'inscription
jeudi 17 août 2006
Statut
Membre
Dernière intervention
4 février 2009
-
Bonjour,

Je suis en train de lire le document "Programmation avancée sous Linux" dans lequel j'ai trouvé le code ci-dessous dans le chapitre relatis aux signaux :

# include < signal.h >
# include < string.h >
# include < sys/types.h >
# include < sys/wait.h >
sig_atomic_t child_exit_status ;

void clean_up_child_process ( int signal_number )
{
   /* Nettoie le ou les processus fils . */
   int status ;
   while ( waitpid ( -1 , & status , WNOHANG ) ) ;
   /* Stocke la statut de sortie du dernier dans une variable globale .
   child_exit_status = status ;
}

int main ()
{
   /* Gère SIGCHLD en appelent clean_up_child_process. */
   struct sigaction sigchld_action ;
   memset (& sigchld_action , 0 , sizeof ( sigchld_action ) ) ;
   sigchld_action.sa_handler = &clean_up_child_process;
   sigaction ( SIGCHLD , & sigchld_action , NULL ) ;
   /* Faire diverses choses , entre autres créer un processus fils . */
   /* ... */
   return 0;
}

A quel endroit se fait le passage de paramètre à la fonction qui doit recevoir un int ?

Merci

2 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
Salut,

sigchld_action.sa_handler = &clean_up_child_process;

Ici, tu met en place l'adresse de clean_up_child_process dans une structure.
Comme l'indique le champ de cette structure, ta fonction est un handler (On parle aussi de callback).

Tu passe ensuite cette structure en argument de sigaction (ici, l'aide de sigaction et les pages de man).

La fonction clean_up_child_process va en fait être appelée non pas par ton propre code, mais par Linux.

Linux s'attend à ce que l'adresse que tu lui donne corresponde à l'adresse d'une fonction qui attend un entier en paramètre, et va passer ce paramètre en argument, de manière à ce que tu le récupère. Si tu met un argument supplémentaire à cleanup, ou que tu enlève le int,le programme a de bonne chances de planter à cause d'un décalage de pile.

clean_up_child_process va être appelé par Linux quand il souhaitera t'informer de l'arrivé d'un message SIGCHLD (Autrement dit, à la fin d'exécution d'un processus fils).

Je suis pas sûre d'avoir été très clair...
Messages postés
19
Date d'inscription
jeudi 17 août 2006
Statut
Membre
Dernière intervention
4 février 2009

Tres clair  Merci