[C/Unix] Liste des fichiers ouverts par un programme
11 réponses
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.
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é.
JKB <knatschke@koenigsberg.fr> é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é.
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é.
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 -+-
OoO Vers la fin de l'après-midi du lundi 01 août 2005, vers 16:12, JKB
<knatschke@koenigsberg.fr> 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 -+-
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 -+-
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
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
<knatschke@koenigsberg.fr> 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...
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
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/
JKB <knatschke@koenigsberg.fr> 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/
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/
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.
Pascal Bourguignon <spam@mouse-potato.com> é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.
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.
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 ?
Laurent Wacrenier wrote in message
<slrndesgii.2mkp.lwa@victor.teaser.fr>:
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
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 ?
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
Laurent Wacrenier <lwa@ teaser . fr> writes:
Pascal Bourguignon <spam@mouse-potato.com> é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
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
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>.
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
<knatschke@koenigsberg.fr> 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>.
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>.
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().
Pascal Bourguignon <spam@mouse-potato.com> é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().