Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[C/Unix] Liste des fichiers ouverts par un programme

11 réponses
Avatar
JKB
Bonjour à tous,

Je suis confronté à un problème bête. Je pense qu'il a une solution
plus élégante qu'un popen sur un lsof ;-)

Existe-t-il un appel de la libc (ou de toute autre bibliothèque tant
qu'on y est) permettant de connaître la liste des fichiers ouverts
par le programme appelant ? J'ai rtfmé, googlisé sans trop de succès
jusques à présent...

Merci d'avance,

JKB

--
En plus c'est simple, je fais ce genre de trucs en g77 depuis des années :
il suffit d'écrire un wrapper en C. Et comme ça, j'ai le meilleur des deux
mondes : la rigueur quasi-monacale du Fortran, et l'exubérance pétulante du C.

10 réponses

1 2
Avatar
Laurent Wacrenier
JKB écrit:
Je suis confronté à un problème bête. Je pense qu'il a une solution
plus élégante qu'un popen sur un lsof ;-)


Pourquoi pas ? "lsof" peut avoir un format adapté aux scripts.

Existe-t-il un appel de la libc (ou de toute autre bibliothèque tant
qu'on y est) permettant de connaître la liste des fichiers ouverts
par le programme appelant ? J'ai rtfmé, googlisé sans trop de succès
jusques à présent...


C'est variable d'un système à l'autre, mais en général, les efforts
pour ce faire sont hors de proportion avec la valeur du résultat
escompté.

Avatar
Vincent Bernat
OoO Vers la fin de l'après-midi du lundi 01 août 2005, vers 16:12, JKB
disait:

Je suis confronté à un problème bête. Je pense qu'il a une solution
plus élégante qu'un popen sur un lsof ;-)

Existe-t-il un appel de la libc (ou de toute autre bibliothèque tant
qu'on y est) permettant de connaître la liste des fichiers ouverts
par le programme appelant ? J'ai rtfmé, googlisé sans trop de succès
jusques à présent...


Sous Linux, lsof semble se baser sur /proc. Les fichiers ouverts sont
ceux pointés par /proc/???/fd.
--
C'est pas avec la censure que tu vas censurer les censeurs.
-+- JL in GNU : Las, censeurs pour l'échafaud -+-

Avatar
JKB
Le 01-08-2005, à propos de
Re: [C/Unix] Liste des fichiers ouverts par un programme,
Vincent Bernat écrivait dans fr.comp.os.unix :
OoO Vers la fin de l'après-midi du lundi 01 août 2005, vers 16:12, JKB
disait:

Je suis confronté à un problème bête. Je pense qu'il a une solution
plus élégante qu'un popen sur un lsof ;-)

Existe-t-il un appel de la libc (ou de toute autre bibliothèque tant
qu'on y est) permettant de connaître la liste des fichiers ouverts
par le programme appelant ? J'ai rtfmé, googlisé sans trop de succès
jusques à présent...


Sous Linux, lsof semble se baser sur /proc. Les fichiers ouverts sont
ceux pointés par /proc/???/fd.


Je sais... Mais je cherche quelque chose de portable...

JKB


Avatar
Pascal Bourguignon
JKB writes:
Je suis confronté à un problème bête. Je pense qu'il a une solution
plus élégante qu'un popen sur un lsof ;-)

Existe-t-il un appel de la libc (ou de toute autre bibliothèque tant
qu'on y est) permettant de connaître la liste des fichiers ouverts
par le programme appelant ? J'ai rtfmé, googlisé sans trop de succès
jusques à présent...


int i;
for(i=0;i<INT_MAX/*Trouver une meilleure limite!*/;i++){
int fd=dup(i);
if(fd>=0){
printf("Le file descriptor %d est ouvert.n",i);
close(fd);
}else if(errno=ëADF){
printf("Le file descriptor %d n'est pas ouvert.n",i);
}else{
printf("Je ne peux rien dire sur le file descriptor %d.n",i);
}
}

--
__Pascal_Bourguignon__ _ Software patents are endangering
() ASCII ribbon against html email (o_ the computer industry all around
/ 1962:DO20I=1.100 // the world http://lpf.ai.mit.edu/
2001:my($f)=`fortune`; V_/ http://petition.eurolinux.org/

Avatar
Laurent Wacrenier
Pascal Bourguignon écrit:
int i;
for(i=0;i<INT_MAX/*Trouver une meilleure limite!*/;i++){


avec getrlimit

int fd=dup(i);


fcntl(i, F_GETFD, &dummy);
permet d'éviter de créer des descripteurs

if(fd>=0){
printf("Le file descriptor %d est ouvert.n",i);
close(fd);
}else if(errno=ëADF){
printf("Le file descriptor %d n'est pas ouvert.n",i);
}else{
printf("Je ne peux rien dire sur le file descriptor %d.n",i);
}


close(fd);

}


Ceci dit, ça n'affichera rien pour les descipteurs dont le père
a mis le drapeau close-on-exec et ça n'indique pas les fichiers
mais simplement les descripteurs.

Avatar
Nicolas George
Laurent Wacrenier wrote in message
:
for(i=0;i<INT_MAX/*Trouver une meilleure limite!*/;i++){
avec getrlimit



Pas clair : on peut avoir hérité d'un fd ouvert loin avant que la limite ait
été abaissée.

fcntl(i, F_GETFD, &dummy);
permet d'éviter de créer des descripteurs


Pourquoi pas fstat ?


Avatar
Pascal Bourguignon
Laurent Wacrenier <lwa@ teaser . fr> writes:

Pascal Bourguignon écrit:
int i;
for(i=0;i<INT_MAX/*Trouver une meilleure limite!*/;i++){


avec getrlimit

int fd=dup(i);


fcntl(i, F_GETFD, &dummy);
permet d'éviter de créer des descripteurs

if(fd>=0){
printf("Le file descriptor %d est ouvert.n",i);
close(fd);
}else if(errno=ëADF){
printf("Le file descriptor %d n'est pas ouvert.n",i);
}else{
printf("Je ne peux rien dire sur le file descriptor %d.n",i);
}


close(fd);


close(fd);close(fd); ça sert à quoi?
close(-1); ça sert à quoi?

}

Ceci dit, ça n'affichera rien pour les descipteurs dont le père
a mis le drapeau close-on-exec et ça n'indique pas les fichiers
mais simplement les descripteurs.


Mais c'est que la plupart des descripteurs ne sont pas des _fichiers_!
Ensuite il faut trouver un truc pour distinguer les socket, les pipes,
les terminaux, etc.

--
__Pascal Bourguignon__ http://www.informatimago.com/
Small brave carnivores
Kill pine cones and mosquitoes
Fear vacuum cleaner


Avatar
Jean-Louis Liagre
JKB wrote:
Le 01-08-2005, à propos de
Re: [C/Unix] Liste des fichiers ouverts par un programme,
Vincent Bernat écrivait dans fr.comp.os.unix :

OoO Vers la fin de l'après-midi du lundi 01 août 2005, vers 16:12, JKB
disait:


Je suis confronté à un problème bête. Je pense qu'il a une solution
plus élégante qu'un popen sur un lsof ;-)

Existe-t-il un appel de la libc (ou de toute autre bibliothèque tant
qu'on y est) permettant de connaître la liste des fichiers ouverts
par le programme appelant ? J'ai rtfmé, googlisé sans trop de succès
jusques à présent...


Sous Linux, lsof semble se baser sur /proc. Les fichiers ouverts sont
ceux pointés par /proc/???/fd.



Je sais... Mais je cherche quelque chose de portable...

JKB


L'équivalent sous Solaris 10 est /proc/<pid>/path/<fd>.



Avatar
Laurent Wacrenier
Pascal Bourguignon écrit:
Ensuite il faut trouver un truc pour distinguer les socket, les pipes,
les terminaux, etc.


Pour les sockets et les terminaux :
getsockname() ttyname()
Pour les pipes, analyser le retour de select().

Avatar
Laurent Wacrenier
Nicolas George <nicolas$ écrit:
fcntl(i, F_GETFD, &dummy);
permet d'éviter de créer des descripteurs


Pourquoi pas fstat ?


fstat() ne marche que sur certains descripteurs (principalement ceux
concernant les fichiers) et avec certaines restrictions.


1 2