2010-03-20 8 views
0

J'ai un processus "x" qui utilise la fonction C "system" pour démarrer le démon ntpd. J'ai observé que ntpd sont passés les descripteurs de fichier ouverts de "x". ntpd conserve les descripteurs de fichier même après la suppression du fichier original. par exemple: Certains fichiers journaux utilisés par "x" sont supprimés après un certain temps, mais "ntpd" a un handle de fichier ouvert pour ces fichiers supprimés. Cela va-t-il causer un problème?Comment trouver tous les gestionnaires de fichiers par un processus par programme?

J'ai également pensé à définir un indicateur "FD_CLOEXEC" pour tous les descripteurs de fichiers avant d'appeler la fonction "système". Mais comme nous fonctionnons comme une bibliothèque d'extension au troisième processus "x" ("x" charge notre bibliothèque en fonction de certaines conditions), il n'y a pas de moyen facile de connaître tous les descripteurs de fichiers ouverts. Une façon est de lire/proc // fd et de définir "FD_CLOEXEC" pour chaque handle de fichier et de le réinitialiser après le retour de la fonction "system". J'utilise Linux 2.6.16. Existe-t-il un autre moyen facile de trouver tous les gestionnaires de fichiers?

Merci,

+1

Voir aussi http://stackoverflow.com/questions/899038/getting-the-highest-allocated-file-descriptor – mark4o

Répondre

3

Oui, cela causera un problème. L'espace disque utilisé par les fichiers supprimés ne sera pas libéré pour réutilisation tant que le dernier descripteur de fichier ouvert n'est pas fermé.

Idéalement, vous devez vous assurer que FD_CLOEXEC est défini sur tous les descripteurs de fichier; avec POSIX 2008, vous pouvez le faire lorsque le fichier est ouvert avec l'indicateur O_CLOEXEC, même. Mais si vous faites partie d'un autre processus et n'êtes pas responsable de son code, alors ce n'est pas du tout facile. Vos choix sont la force brute et l'ignorance. Vous pouvez parcourir tous les descripteurs que vous pensez être ouverts et les fermer, en ignorant les erreurs des descripteurs déjà fermés. C'est de la force brute. Ou vous pouvez ignorer les fichiers ouverts et espérer que le système ne se bloque pas trop. Vous pouvez peut-être limiter votre recherche en vérifiant combien de fichiers vous pouvez ouvrir en même temps.

+0

Merci Jonathan, Idéalement je l'aurais prévu un paramètre supplémentaire « inheritHandle » dans le cadre de la fourche () afin qu'il soit facile de décider de passer des handles de fichiers au moment de la création du processus. "CreateProcess" dans Windows a un tel paramètre. Je ne sais pas pourquoi personne ne pensait à ça sous Linux? – kumar

+0

@kumar: La difficulté consiste à contrôler quels sont les descripteurs de fichiers critiques à garder ouverts - par exemple, stdin, stdout, stderr sont souvent définis avec soin et doivent être gardés ouverts - et qui devraient être fermés. Il y a des systèmes où il est crucial de garder certains descripteurs ouverts à travers les appels 'exec()' - Purify et X11 sont deux exemples. Ainsi, la difficulté serait "comment spécifiez-vous quels descripteurs de fichiers devraient être fermés". Cela dit, il ne serait pas terriblement difficile de trouver un schéma - les appels système 'select()' et 'poll()' gèrent des listes de descripteurs (de différentes manières). –

+0

@Jonathan: Pourriez-vous expliquer la nécessité de garder fds ouverts les appels 'exec()' d'accros, dans le cas de X11? À mon humble avis, il est généralement inutile, voire préjudiciable. – jpalecek

Questions connexes