Il y a quelques mois, j'écris une application CGI pour Linux qui utilise Maintenant, j'ai lu que pour des pipes fermées est nécessaire à une utilisation Le manuel dit: P> La valeur de retour de Mon code est comme ceci: P> popen () code> pour lire la sortie d'une commande, puis je ferme le tuyau avec
FCLose () code> .
pccle () code>. p>
popen () code> est un flux d'E / S standard normal dans tout
respects sauvegardez qu'il doit être fermé avec
pclose () code> plutôt que
FCLOSE (3) CODE>. P>
blockQuote>
if ((NULL != (f = popen(command.value, "r")))) {
//do something
fclose(f);
}
3 Réponses :
Si vous utilisez FcLose sur le tuyau, vous aurez des fuites de descripteur de fichier, car FcLose ne libérera pas le pointeur de fichier dans le noyau (qui est créé lorsque vous créez le tuyau depuis son fichier). p>
Bien que vos tests ne puissent donc pas avoir montré aucun problème, exécutez votre programme 3000 fois (ou comment de nombreux descripteurs de fichiers sont autorisés, à la hausse de l'INT, je pense) et de regarder lorsque vous ne serez plus en mesure de créer des tuyaux. p>
Typiquement fclose code> sur le flux de stddio réellement fait i> ferme le descripteur de tuyau sous-jacent (c'est caché dans
FP -> _ Fileno code> ou quel que soit le champ nommé), C'est donc plus un zombie-proc-fuite qu'une fuite FD.
Selon ce fil , en utilisant FCLOSE code> au lieu de
pclose code> signifie que le processus à l'autre extrémité de la tuyau ne va pas récolter, il reste donc zombié. P>
Très merci, alors je ne ferme pas la pipe, c'est mauvais, merci.
Je viens de découvrir (après 10 ans) que j'utilisais par erreur Mais j'avais besoin du code de retour du dernier code> Popen code> et fermer a été effectué correctement avec Il a l'effet étrange du retour d'un code d'erreur 0 (peut-être collecter le code retour du processus précédemment non code> peclose code> processus), même si la commande a échoué, créant un bogue très étrange dans le code, qui aurait pu conduire à des erreurs catastrophiques car l'appelant pense que le commandement a fonctionné. P>
Ce n'est pas seulement une question de descripteurs qui fuies, il peut introduire des bugs fonctionnels dans votre code (même si l'application fonctionne pendant quelques secondes et que vous ne vous souciez pas de fuites descripteurs) p> FcLose Code> pour certains
Popen code> Appels, exécuté sur Windows 2008 Server. Ça a fonctionné (c'est-à-dire pas écrasé), et je me suis préoccupé par le code de retour sur ces appels de toute façon. P>
pclose code>. p>.
BTW, c'est un système d'exploitation très spécifique. L'OP a explicitement interrogé sur Linux. Et des distributions Linux habituelles ont un logiciel libre Libc, afin que l'OP devrait étudier le code source de sa mise en œuvre de la libc.
Ok, mais ce qui est arrivé pour moi sur Windows pourrait aussi se produire sur d'autres systèmes.
Sauf que l'aspect logiciel libre évolue beaucoup comment résoudre ce problème. Si votre LIBC (et votre noyau) était un logiciel libre, vous pouvez inspecter et étudier son code source (et comprendre ce qui se passe).
Oui. Mais même avec le code source, c'est clairement une erreur et il est facile de se réparer, alors ne laissez pas cela comme ça.
Vous avez un comportement indéfini: lisez
pclose () Code> vs
: la fonctionfcfose () code>?
_pclose code> Recherche l'ID de processus du processeur de commande (cmd.exe) démarré par le
_Popen code> appel, exécute un
_cwait code> appelez le nouveau processeur de commande et ferme le flux sur la tuyau associée.`
Il y a des postes sur votre question: 1.
FLOSE () / pclose () code> peut bloquer sur certains pointeurs de fichiers
et Quelle est la poigne de fermeture à UNIX?(fcfrose () de pclose ()) code>?
Merci, je vais résoudre parce que c'est vraiment important. Maintenant, j'ai l'impact.
Sur Linux, le
libc code> implémentation
populaire code> est souvent un logiciel libre. J'étudie donc le code source de votre libc. Je suppose que non la téléphonie
popen code> signifie que
waikepid code> ne sera pas appelé, et vous aurez des processus zombies. Mais je vous laisse vérifier.