Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/09/2019, à 18: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 smile

D.

Dernière modification par DonutMan75 (Le 17/09/2019, à 15:54)

Hors ligne

#2 Le 16/09/2019, à 19: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, à 06: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 smile

Donut

Hors ligne

#4 Le 17/09/2019, à 11:26

k3c

Re : [RESOLU] Connaître le nombre de "lecteurs" d'un fichier donné ?

essaie

lsof /var/log/syslog

pour voir


Archlinux sur Xiaomi Air 13

Hors ligne

#5 Le 17/09/2019, à 15: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 smile

Donut

Hors ligne