Passage de parametres a une fonction

Résolu
AsM0DeUz Messages postés 19 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 4 février 2009 - 17 juil. 2008 à 14:35
AsM0DeUz Messages postés 19 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 4 février 2009 - 18 juil. 2008 à 09:02
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

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 juil. 2008 à 15:55
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...
3
AsM0DeUz Messages postés 19 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 4 février 2009
18 juil. 2008 à 09:02
Tres clair  Merci
0
Rejoignez-nous