Quelle est la différence entre ces paramètres? Selon "Programmation avancée dans l'environnement UNIX, 2e édition", Figure 10.1 La valeur par défaut de Sigchld est "Ignorer" p> Si "Ignorer" signifiait "Sig_ign", aucun enfant ne serait jamais un zombie, et ce n'est pas le cas. P> Il ne s'agit pas beaucoup plus clair de là: P > Si le processus définit spécifiquement sa disposition à SIG_ign, enfants
du processus d'appel ne générera pas de processus zombies. Noter que
Ceci est différent de son action par défaut (SIG_DFL), qui de la figure
10.1 doit être ignoré. Au lieu de cela, sur la résiliation, le statut de ces processus enfants
est jeté. p>
BlockQuote> J'ai du mal à groker quel est l'impact des différentes valeurs (ou une non-valeur non définie). Jusqu'à présent, la solution a été de tourner à travers ces choix jusqu'à ce que je reçoive le comportement souhaité et je préfère comprendre exactement comment chaque valeur définit le comportement du signal. P> Le comportement: un processus d'enfant est appeler "système" ou utiliser des backticks qui créent un autre enfant et que le signal serait normalement capturé par le mauvais gestionnaire (parent). La définition d'un gestionnaire local peut fonctionner, mais je ne comprends pas quelle valeur est la plus appropriée si je veux le signal du grand-enfant de ne rien faire. P> Quelqu'un pourrait-il vous éclairer? P> < p> considère le fragment suivant: p> perl 5.8.6 sur Solaris 10 affichera "Signal Chld "Messages pour le PID de l'appel système (). Faire n'importe quoi, même aussi trivial que p> SIG $ local {CHLD}; P>
blockQuote> chez l'enfant supprimera ces messages. P> sur toutes les autres saveurs que j'ai essayées, la faucheuse ne voit jamais l'enfant. P> P>
4 Réponses :
Il y a deux façons d'éviter de créer des processus zombies: P>
$ sig {chld} = 'ignorer' code> li>
- récolte les enfants morts expliquellement avec le
attendre code> ou appelé code> appels (cela pourrait être fait à l'intérieur d'un gestionnaire Sigchld, mais il n'est pas nécessaire de ne pas être) li>
ol>
Réglage $ SIG {CHLD} = 'Ignorer' code> piège le SIGCHLD au niveau du système d'exploitation, nettoyant le processus enfant sans même signaler votre programme PERL. P>
Tout autre paramètre, y compris 'par défaut' code>, undef code>, "" code>, sous {} code>, < Code> 'Certain_function_name_that_doesnt_even_exist' code> entraînera la livraison du signal à Perl, et l'enfant ne sera pas récolté automatiquement. P>
en récolérant le processus vous-même avec attendre code> et waiterpid code>, vous pouvez obtenir des informations supplémentaires telles que l'état de sortie du processus enfant et (plus ou moins). ordre dans lequel l'enfant traite fini. Si $ SIG {CHLD} code> est défini sur 'Ignorer' code>, wait code> et waiterpid code> toujours retour -1 et don 't set $? code>. p>
Le sigchld code>, le cas échéant, est toujours livré au processus qui a engendré le processus enfant, je ne pense donc pas que vous avez raison de dire qu'un sigchld code> de Un processus de petit-enfant (à partir d'un système code> code> appel dans un processus enfant) est pris dans le processus parent. Probablement ce qui se passe est que votre processus enfant hérite du gestionnaire de signal de son processus parent. P>
système code> et backticks (sur la plupart des systèmes) génère un sigchld code> à la fin et définira la valeur $? code> avec l'état de sortie de la commande . Mais Perl récoltera ces sous-processus lui-même, et vous ne serez pas en mesure de capturer l'ID de processus d'un appel code> ou d'appel de backticks avec attendre code> ou waiterpid code >. P>
3. récolter les enfants morts implicitement en sortant.
voir % SIG code>
.
Quant à la récolte, les enfants d'un parent dont le gestionnaire Sigchld est défini explicitement sur $ SIG {CHLD} = 'Ignorer'; code> provoque l'ignorer les signaux SIGCHLD. P>
$ SIG {CHLD} = 'Par défaut'; CODE> Causes Votre processus pour traiter les signaux SIGCHLD, car il ne vous aurait pas été gâché avec
$ SIG {CHLD} code> ou équivalent. Selon Kill (1), un processus sur mon système ignore Sigchld par défaut P>
$ SIG {CHLD} = ''; code> et
$ SIG {CHLD} = Undef ; code> ne sont pas des valeurs valides. P>
Ignorer code> sera automatiquement récolté par le système dès que le système dès que Il sort. p>
'' ' code> et
UNDEF code> sont des valeurs valides et ils se dressent, de même que
Supprimer $ SIG {CHLD} code>.
@mob, es-tu dites UNDEF CODE> SETS POUR IGNORE ET
Supprimer CODE> Définit par défaut? Néanmoins, cela ne les rend pas valide. D'après ce que vous avez dit dans votre solution, il semble qu'il y ait simplement un manque de vérification des erreurs à l'heure actuelle (depuis l'utilisation de
ignoré code> réellement
par défaut code>).
Ils sont tous indiscernables d'attribuer $ SIG {CHLD} = 'Par défaut' code>. Ils sont valables en ce sens qu'ils ne cassent pas le code ni les avertissements émettent des avertissements - je ne voulais pas suggérer que ces constructions font partie de la spécification PERL. Une future mise en œuvre peut interdire ou décourager ces missions, ou proscrire un sens totalement différent pour eux.
Il existe deux signification différente pour "ignorer", et ils se produisent à deux points d'évaluation différents. P>
Mais si $ SIG {CHLD} est autre chose que «ignorer», cela signifie de délivrer le signal au processus parent, auquel il existe un gestionnaire de signal personnalisé ou un gestionnaire de signal par défaut, et le gestionnaire par défaut sera varier sur différents systèmes ou même des versions du même système d'exploitation. La page du livre et du signal (7) Manque de ce qui se passe par défaut si un signal est livré au processus parent em> (c'est-à-dire que le gestionnaire n'est pas défini sur "Ignorer"). Donc La seconde utilisation de l'ignore est liée à laquelle action em> à prendre pour un signal livré fort>. Par exemple, SIGINT entraînera la résiliation de votre processus et SIGSTOP entraînera votre processus de "pause", bien que les gestionnaires de signal personnalisés changent ces actions par défaut. p>
pour le signal SIGCHLD, la valeur par défaut est de "ignorer", mais dans cette utilisation forte> Cela signifie simplement que le processus (parent) continue de continuer à exécuter normalement pendant que le processus d'enfant attend (c'est-à-dire aucune résiliation ou abandon du processus parent). Vous pouvez ensuite attendre () dessus plus tard pour que ce soit des informations et d'éviter un zombie. P>
$ SIG {CHLD} = 'ignorer' p> blockQuote>
Ceci est transmis au système d'exploitation comme Sig_ign, qui, selon la DOCS du système d'exploitation, rend les processus enfants terminés sans devenir des zombies (ou signaler leur code de sortie au parent). P>
$ SIG {CHLD} = 'Par défaut'
$ SIG {CHLD} = ''
$ SIG {CHLD} = UNDEF P> blockQuote>Ceux-ci sont tous identiques au niveau du système d'exploitation (ils appelleront le signal () avec SIG_DFL). Cependant, certains paquets Perl, notamment Anyevent :: Child, ne fonctionneront pas lorsque $ SIG {CHLD} est défini sur "Par défaut". p>
Voulez-vous dire "sans" se terminer par devenir "
Oui merci. (Je traversais très ancien email.)
local $ SIG {CHLD}; code> est identique à
SIG {chld} = UNDF; code>