#1 Le 16/09/2019, à 17:04
- DonutMan75
[RESOLU] Connaître le nombre de "lecteurs" d'un fichier donné ?
Bonjour à tous,
savez-vous s'il est possible de connaître le nombre de lecteur d'un fichier donné ?
Ma problématique est la suivante :
on m'a passé un programme et je n'ai pas forcément accès à l'ensemble du code source.
Je suppute que ce programme lance un grand nombre de fopen() sur un fichier de données précis et connu, sans forcément les refermer par la suite.
J'aurais aimé contrôler cette hypothèse.
Avez-vous des idées ?
Merci d'avance
D.
Dernière modification par DonutMan75 (Le 17/09/2019, à 14:54)
Hors ligne
#2 Le 16/09/2019, à 18:39
- Watael
Re : [RESOLU] Connaître le nombre de "lecteurs" d'un fichier donné ?
salut,
avec strace ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 17/09/2019, à 05:49
- DonutMan75
Re : [RESOLU] Connaître le nombre de "lecteurs" d'un fichier donné ?
Salut Watael !
Merci ça semble répondre à mon besoin, je l'essaie tout à l'heure au taf !
En farfouillant un peu de mon côté, je suis également tombé sur la commande lsof qui peut apporter des éléments de réponses (à voir si avec une option ou un grep bien placé on peut ne garder que les descripteurs d'un fichier donné).
Bonne journée à tous
Donut
Hors ligne
#4 Le 17/09/2019, à 10:26
- k3c
Re : [RESOLU] Connaître le nombre de "lecteurs" d'un fichier donné ?
essaie
lsof /var/log/syslog
pour voir
Debian 12 sur Thinkpad reconditionné
Hors ligne
#5 Le 17/09/2019, à 14:53
- DonutMan75
Re : [RESOLU] Connaître le nombre de "lecteurs" d'un fichier donné ?
Bonjour à tous,
bon j'ai pu tester un peu les différentes suggestions et voici une petite synthèse :
1) Suivi du nombre de lecteur via la commande lsof
Le code C suivant va ouvrir trois fois en lecture seule un fichier d'entrée, puis refermer chacun des flux.
#include <stdio.h> // fopen()
#include <unistd.h> // sleep(), getpid()
#include <stdlib.h> // system()
#include <sys/types.h> // getpid()
#define TAILLE 3
int main(void)
{
FILE *table[TAILLE];
char commande[128] = {0};
int k;
pid_t me = getpid();
sprintf(commande, "lsof -p %d | grep data.txt", (int) me);
for (k=0;k<TAILLE; k++)
{
fprintf(stdout, "- [%d] fopen number %02d\n", (int) me, k+1);
*(table+k) = fopen("./data.txt", "r");
sleep(1);
system(commande);
}
for (k=0;k<TAILLE; k++)
{
fprintf(stdout, "- [%d] fclose number %02d\n", (int) me, k+1);
fclose(*(table+k));
sleep(1);
system(commande);
}
return 0;
}
A chaque changement (ouverture ou fermeture), je fais appel à la fonction lsof. Le prototype est ici le suivant :
lsof -p pid
pid étant le process id de mon programme.
Voici ce que j'obtiens à l'exécution :
$ gcc read_data.c -o read_data
$ ./read_data
- [7065] fopen number 01
read_data 7065 donut 3r REG 0,24 14 62630564 /users/donut/testlsof/data.txt
- [7065] fopen number 02
read_data 7065 donut 3r REG 0,24 14 62630564 /users/donut/testlsof/data.txt
read_data 7065 donut 4r REG 0,24 14 62630564 /users/donut/testlsof/data.txt
- [7065] fopen number 03
read_data 7065 donut 3r REG 0,24 14 62630564 /users/donut/testlsof/data.txt
read_data 7065 donut 4r REG 0,24 14 62630564 /users/donut/testlsof/data.txt
read_data 7065 donut 5r REG 0,24 14 62630564 /users/donut/testlsof/data.txt
- [7065] fclose number 01
read_data 7065 donut 4r REG 0,24 14 62630564 /users/donut/testlsof/data.txt
read_data 7065 donut 5r REG 0,24 14 62630564 /users/donut/testlsof/data.txt
- [7065] fclose donut 02
read_data 7065 donut 5r REG 0,24 14 62630564 /users/donut/testlsof/data.txt
- [7065] fclose number 03
Comme attendu, je vois bien le nombre de lecteur qui monte jusqu'à 3 puis redescend à 0 (le dernier grep ne renvoyant rien du tout).
On aurait également pu tenter un :
lsof -t ./data.txt
qui renvoie la liste des processus qui lisent ce fichier. Mais dans ce cas là, l'interprétation est plus délicate (qui sont 7682, 7685, ... ??) :
./read_data
- [7681] fopen number 01
7681
7682
- [7681] fopen number 02
7681
7685
- [7681] fopen number 03
7681
7688
- [7681] fclose number 01
7681
7691
- [7681] fclose number 02
7681
7694
- [7681] fclose number 03
1) Suivi du nombre de lecteur via la commande strace
J'ai commenté les appels système à lsof et j'ai utilisé strace de cette façon :
$ strace ./read_data 2>&1 | grep -iE "(open|close)"
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
open("./data.txt", O_RDONLY) = 3
open("./data.txt", O_RDONLY) = 4
open("./data.txt", O_RDONLY) = 5
close(3) = 0
close(4) = 0
close(5) = 0
write(1, "- [8263] fopen number 01\n- [8263"..., 153- [8263] fopen number 01
- [8263] fopen number 02
- [8263] fopen number 03
- [8263] fclose number 01
- [8263] fclose number 02
- [8263] fclose number 03
On voit bien passer les différents appels à la commande bas niveau open() ainsi que les close() associés :
open("./data.txt", O_RDONLY) = 3
open("./data.txt", O_RDONLY) = 4
open("./data.txt", O_RDONLY) = 5
close(3) = 0
close(4) = 0
close(5) = 0
Bon eh bien du coup, j'ai plus qu'à brancher tout ça autour du programme qu'on m'a passé et je verrai bien si des fclose() ont été oubliés !!
Merci à vous tous
Donut
Hors ligne