Un programme a-t-il les moyens de refermer les FILE * ouverts par lui ?
5 réponses
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)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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)
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
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
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.
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
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
Le 09 Oct 2003 05:24:11 GMT, Thomas Baruchel <thomas.baruchel@libertysurf.fr> é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.
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
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.
Thomas Baruchel <thomas.baruchel@libertysurf.fr> é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.
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.
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
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).
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).