2009-08-22 6 views
10

Comment trouver tous les fichiers ouverts dans un processus (depuis l'intérieur de lui-même)? Ceci semble utile à savoir après un fork() (avant exec()).Fermeture de tous les fichiers ouverts dans un processus

Je sais de l'existance de getdtablesize() et sysconf(_SC_OPEN_MAX) plus portable, mais il semble inefficace pour tenter de fermer tous les descripteurs de fichier valide, s'il y a un fichier ouvert derrière ou non. (Je suis également conscient des dangers de l'optimisation prématurée, c'est plus sur l'esthétique je suppose :-)

Répondre

3

Il peut sembler inefficace de tenter de fermer tous les descripteurs de fichiers, mais ce n'est pas si grave. L'implémentation de l'appel système pour rechercher un descripteur de fichier devrait être assez efficace si le système est bon.

Si vous souhaitez rechercher uniquement les descripteurs de fichier ouverts, vous pouvez utiliser le système de fichiers proc sur les systèmes où il existe. Par exemple. sous Linux,/proc/self/fd listera tous les descripteurs de fichiers ouverts. Effectuez une itération sur ce répertoire et fermez tout> 2, en excluant le descripteur de fichier qui indique le répertoire sur lequel vous itérez.

8

Si votre programme appellera fork et exec, vous devriez vraiment ouvrir tous les descripteurs de fichiers avec le drapeau O_CLOEXEC de sorte que vous ne devez pas les fermer manuellement avant exec. Vous pouvez également utiliser fcntl pour ajouter ce drapeau après l'ouverture d'un fichier, mais cela est soumis à des conditions de concurrence dans les programmes multithread.

+0

Bienvenue sur les courses. – ybungalobill

Questions connexes