Fork et die - Perl - Programmation
Marsh Posté le 18-06-2009 à 17:59:49
Pourquoi ne pas passer par kill?
J'ai pas testé, mais je ferais ainsi pour ton premier cas
Code :
|
Je ne sais pas trop ce que signifie
Code :
|
car habituellement, on ne définit pas un sub à l'intérieur d'une autre procédure.
Le fils meurt et pas le père? bizarre.
A+,
Marsh Posté le 18-06-2009 à 22:02:30
gilou a écrit : Pourquoi ne pas passer par kill?
|
T'es obligé de kill. Sinon tu peux tenter des fourberies avec alarm + nettoyage des fils du fils ...
Marsh Posté le 19-06-2009 à 09:26:26
gilou a écrit : Pourquoi ne pas passer par kill?
|
En fait peut importe comment on tue le fils, tu peux envoyer un signal ou bien lui demander de faire ça lui même.
Dans mon cas, je gère effectivement les timeout des fils en envoyant des signaux de fin, mais là c'est dans le cas ou par exemple la connexion ssh plante, pour ne pas lancer les commandes suivantes de copies de fichier.
Dans ce cas le père ne peut pas savoir le statut de la commande, donc c'est au fils de se terminer, d'où le die.
Exemple :
Code :
|
gilou a écrit :
|
Justement c'est ça qui le chagrine, si je ne définie pas le sub à l'intérieur de la procédure contenant le "if $pid == 0", ce n'est pas le fils qui meurt, mais le père.
Dans le cas où j'ai 150 serveurs à traiter c'est gênant, car dès qu'une connexion échoue, je dois tout recommencer.
Le problème n'est pas handicapant outre mesure car en mettant les subs a l'intérieur du code du fils ça fonctionne mais je préférerais déclarer mes subs ailleurs..
Pour le peu que je connais du fork, il me semblait que le code était dupliqué :
- Est-ce tout le code ou juste le code dans lequel on définit "if $pid==0" ?
- Est-ce possible que le fils appelle la fonction du père plutôt que de dupliquer le code ?
Marsh Posté le 19-06-2009 à 18:56:45
Comme je code en java ces temps ci, je n'avais pas les idées nettes.
Je procéderais ainsi:
Code :
|
Ici, byebye est une fonction commune, qui ne tuera que les fils
A+,
Marsh Posté le 19-06-2009 à 19:29:27
Noter aussi qu'on peut passer par un pointeur de fonction:
Code :
|
Noter qu'ici, je n'ai pas mis le code qui évite au fils de forker, pour plus de clarté.
&$functionref() sera un appel a do_nothing dans le père et a do_exit dans les fils.
A+,
Marsh Posté le 18-06-2009 à 10:55:40
Bonjour,
J'ai un programme qui appelle des connexions SSH sur différents serveurs dans une boucle.
Pour simuler un timeout j'utilise des fork, et si le timeout arrive a expiration je tue le fils.
Si la connexion plante ou qu'il y a un problème, je demande également au fils de se tuer.
Mon problème est que si je lui demande de se tuer a l'intérieur d'une fonction qui est dans le code mais a l'extérieur du "if $fork == 0" le programme se tue, si je place la fonction à l'intérieur par contre j'ai le comportement souhaité (mais j'aimerai bien mettre mes fonctions a l'extérieur dans un souci de lisibilité).
En bref, le comportement suivant est-il normal ?