OVH Cloud OVH Cloud

Un programme a-t-il les moyens de refermer les FILE * ouverts par lui ?

5 réponses
Avatar
thomas.baruchel
Un programme écrit en C n'ayant pas un contrôle total de son déroulement,
essentiellement parce qu'il est "piloté" par un programme extérieur
relativement souple à l'égard des souhaits de l'utilisateur, est
susceptible d'ouvrir des FILE * (déclarés en local) sans avoir le
temps de les refermer car le programme extérieur peut forcer la fin
de l'exécution d'une fonction. J'aimerais donc fournir de mon côté une
sorte de fonction de reset(), à la discrétion de l'utilisateur, qui
nettoierait quand même un peu les choses. Ma question est donc:

y a-t-il un moyen pour un programme to refermer TOUS les FILE * laissés
ouverts ? Je précise qu'il n'y a aucune ambiguité, pas de test à faire:
l'exécution de cette fonction aurait comme but de refermer tous ces FILE *
sans la moindre exception (bien sûr, seulement ceux ouverts par le programme
lui-même, mais cela va de soi.)

Je rappelle qu'ils sont tous déclarés en local.

--
« nous devons agir comme si la chose qui peut-être ne sera pas devait
être » (Kant, Métaphysique des moeurs, doctrine du droit, II conclusion)

Thomas Baruchel <baruchel@laposte.net>

5 réponses

Avatar
DINH Viêt Hoà

Un programme écrit en C n'ayant pas un contrôle total de son déroulement,
essentiellement parce qu'il est "piloté" par un programme extérieur
relativement souple à l'égard des souhaits de l'utilisateur, est
susceptible d'ouvrir des FILE * (déclarés en local) sans avoir le
temps de les refermer car le programme extérieur peut forcer la fin
de l'exécution d'une fonction. J'aimerais donc fournir de mon côté une
sorte de fonction de reset(), à la discrétion de l'utilisateur, qui
nettoierait quand même un peu les choses. Ma question est donc:

y a-t-il un moyen pour un programme to refermer TOUS les FILE * laissés
ouverts ? Je précise qu'il n'y a aucune ambiguité, pas de test à faire:
l'exécution de cette fonction aurait comme but de refermer tous ces FILE *
sans la moindre exception (bien sûr, seulement ceux ouverts par le programme
lui-même, mais cela va de soi.)


Ce programme, étant piloté, n'a-t-il pas moyen de noter les FILE * qui ont
été ouvert ?

ou sinon, peux-tu redéfinir la fonction fopen(), afin qu'elle note en même
temps les FILE * qu'elle a ouvert ? (mot clef : preload)

--
DINH V. Hoa,

"monde de merde" -- Erwan David

Avatar
JKB
Le jeu, 09 oct 2003 at 05:24 GMT, à propos de
Un programme a-t-il les moyens de refermer les FILE * ouverts par lui ?,
Thomas Baruchel écrivait dans fr.comp.os.unix :
Un programme écrit en C n'ayant pas un contrôle total de son déroulement,
essentiellement parce qu'il est "piloté" par un programme extérieur
relativement souple à l'égard des souhaits de l'utilisateur, est
susceptible d'ouvrir des FILE * (déclarés en local) sans avoir le
temps de les refermer car le programme extérieur peut forcer la fin
de l'exécution d'une fonction. J'aimerais donc fournir de mon côté une
sorte de fonction de reset(), à la discrétion de l'utilisateur, qui
nettoierait quand même un peu les choses. Ma question est donc:

y a-t-il un moyen pour un programme to refermer TOUS les FILE * laissés
ouverts ? Je précise qu'il n'y a aucune ambiguité, pas de test à faire:
l'exécution de cette fonction aurait comme but de refermer tous ces FILE *
sans la moindre exception (bien sûr, seulement ceux ouverts par le programme
lui-même, mais cela va de soi.)

Je rappelle qu'ils sont tous déclarés en local.




Deux solutions, la première violente : fcloseall() qui ferme tous
les fichiers (y compris stdin, stdout et stderr). La seconde
consiste à réécrire une routine utilisant fopen() et mettant le
FILE* dans une liste chaînée passée comme argument à une routine
fcloseall_() qui se charge de fermer tout ce qu'il y a d'ouvert.

Cordialement,

JKB

Avatar
Stephane CHAZELAS
Le 09 Oct 2003 05:24:11 GMT, Thomas Baruchel écrivait :
[...]
y a-t-il un moyen pour un programme to refermer TOUS les FILE * laissés
ouverts ? Je précise qu'il n'y a aucune ambiguité, pas de test à faire:
l'exécution de cette fonction aurait comme but de refermer tous ces FILE *
sans la moindre exception (bien sûr, seulement ceux ouverts par le programme
lui-même, mais cela va de soi.)
[...]


Note que exit(3) est censé refermer tous les FILE*. Je pense que
retourner de main() a le meme effet.

La glibc a fcloseall(3).

--
Stéphane

Avatar
Laurent Wacrenier
Thomas Baruchel écrit:
Un programme écrit en C n'ayant pas un contrôle total de son déroulement,
essentiellement parce qu'il est "piloté" par un programme extérieur
relativement souple à l'égard des souhaits de l'utilisateur, est
susceptible d'ouvrir des FILE * (déclarés en local) sans avoir le
temps de les refermer car le programme extérieur peut forcer la fin
de l'exécution d'une fonction. J'aimerais donc fournir de mon côté une
sorte de fonction de reset(), à la discrétion de l'utilisateur, qui
nettoierait quand même un peu les choses. Ma question est donc:

y a-t-il un moyen pour un programme to refermer TOUS les FILE * laissés
ouverts ? Je précise qu'il n'y a aucune ambiguité, pas de test à faire:
l'exécution de cette fonction aurait comme but de refermer tous ces FILE *
sans la moindre exception (bien sûr, seulement ceux ouverts par le programme
lui-même, mais cela va de soi.)


Pas en standart. fopen() ouvre un descripteur de fichier et alloue des
ressources (typiquement par malloc). Si on peut fermer tous les
descripteurs avec un série de close() jusqu'àu plus grand descripteur
possible, il n'y a pas moyen de trouver et de liberer les autres
ressouces allouées avec fopen().

Bref, il faut utiliser d'autres fonctions d'ouverture et de
fermeture. Par exemple, on peut enrober fopen() et fclose() (voir
aussi fdopen() et les autres fonctions ouvrant des FILE*) dans une
fonction qui va noter les FILE * ouverts et les libérer quand on le
jugera bon.

Avatar
DINH Viêt Hoà

Deux solutions, la première violente : fcloseall() qui ferme tous
les fichiers (y compris stdin, stdout et stderr). La seconde
consiste à réécrire une routine utilisant fopen() et mettant le
FILE* dans une liste chaînée passée comme argument à une routine
fcloseall_() qui se charge de fermer tout ce qu'il y a d'ouvert.


CONFORMING TO
The fcloseall function is a GNU extension.

solution non validée (à moins qu'on soit exclusivement sous Linux).

--
DINH V. Hoa,

"monde de merde" -- Erwan David