AsM0DeUz
Messages postés19Date d'inscriptionjeudi 17 août 2006StatutMembreDernière intervention 4 février 2009
-
17 juil. 2008 à 14:35
AsM0DeUz
Messages postés19Date d'inscriptionjeudi 17 août 2006StatutMembreDerniè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 ?
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).
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.