Fermer tous les fichiers ouverts dans un processus

Comment trouver tous les fichiers ouverts dans un processus (de l’intérieur)?

Cela semble utile de savoir après un fork() (avant exec() ).

Je connais l’existence de getdtablesize() et du plus portable sysconf(_SC_OPEN_MAX) , mais il semble inefficace de tenter de fermer tous les descripteurs de fichiers valides , qu’il y ait un fichier ouvert ou non. (Je suis également conscient des dangers de l’optimisation prématurée, je pense que c’est plus une question d’esthétique 🙂

Les mécanismes existants sont spécifiques à la plate-forme. Voir cette réponse

Si votre programme appelle fork et exec , vous devez vraiment ouvrir tous les descripteurs de fichiers avec l’indicateur O_CLOEXEC pour ne pas avoir à les fermer manuellement avant exec . Vous pouvez également utiliser fcntl pour append cet indicateur après l’ouverture d’un fichier, mais cela dépend des conditions de concurrence dans les programmes multithread.

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 trouver uniquement les descripteurs de fichiers ouverts, vous pouvez utiliser le système de fichiers proc sur les systèmes existants. Par exemple, sur Linux, / proc / self / fd listera tous les descripteurs de fichiers ouverts. Parcourez ce répertoire et fermez tout> 2, à l’exception du descripteur de fichier qui indique le répertoire sur lequel vous effectuez une itération.