IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Coment obtenir le nombre total de file descriptor ouvert?


Sujet :

Réseau C

  1. #1
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut Coment obtenir le nombre total de file descriptor ouvert?
    Bonjour,

    Voilà je désirerais faire un test sur le nombre total de fd ouvert et j'ai beau cherché, je ne trouve pas de fonction C ou linux qui permettrait de retourner directement cette valeur.

    J'ai contasté que la fonctin select() peut en effet retourner le nombre de fd en activité mais comment l'utiliser dans ce but en jouant sur les paramètres d'entée?

    Si vous avez une idée ou connaissez une fonction ou un moyen d'obtenir ce résultat, il sera le bienvenue.

    Bonne fin de journée.

    Nicolas

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    tu peux trouver cela dans /proc/'pid'/fd/ (il me semble).
    remarque, c'est peut etre pas la meilleure solution.
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Bonsoir,

    C'est plus "linux" que du C, sinon :
    - y'a lsof (sous root) qui te donne la liste des fichiers ouvert (pas trop de rapport, mais bon, si ca peut t'aider (a regarder le code?))
    - la solution de Dark_Ebola a l'air pas mal, j'ajouterai juste que /proc/self pointe directement sur les données de ton process (pas besoin de récuperer le pid)
    - si tu veux connaitre tous les fd ouvert par ton process avec select, il faut que tu les connaisses tous (pour pouvoir les passer dans les "ensembles" que select peut analyser).

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Bonjour,

    Pour attaquer la matinée je viens de lire vos réponses.

    En fait, je ne comprends pas très bien, vous me donnez le chemin d'un répertoire...Comment récupérer les infos à partir de là, ou déduire le nombre de fd ouverts?

    Sinon à propos du select, j'avais fait cela, je précise que ca ne fonctionne pas car la scrutation est infini et qu'il faut un fonctionnement correct si on veut que le résultat retourné correspond aux nombres de fd en activité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numFd = select(FD_SETSIZE, NULL, NULL, NULL, NULL)
    Peut être pourrais je simuler une écriture ou une lecture...Mais quand même, c'est quand même dommage!

    Bonne journée

    Nicolas

  5. #5
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Bien en fait, je suis allé sous root pour lire le fichier /proc/self/fd et j'obtiens ceci:
    frcesw0050049 <67:ndelh>pwd
    /proc/self/fd
    frcesw0050049 <68:ndelh>ls
    0 1 15 16 17 18 19 2
    Donc au niveau du code j'ai fait ceci pour lire le nombre de descripteurs de fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    FILE *fp = NULL;
    	UInt16 numFd = 0;
    	int c;
     
    	fp = fopen("/proc/self/fd", "r");
    	if(fp == NULL)
    		printf("---Reading error of /proc/self/fd file---\n");
     
    	while ((c = fgetc(fp)) != EOF)
        {
       		numFd++;
       		printf("Numéro fd = %d		nombre fd = %d\n",c,numFd);
        }
    	fclose(fp);
    Malheureusement, je tombe dans le message d'erreur car fp == NULL et je ne comprends pas pourquoi...Auriez vous une idée?

    Merci

    Nicolas

  6. #6
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par homeostasie
    Bien en fait, je suis allé sous root pour lire le fichier /proc/self/fd et j'obtiens ceci:


    Donc au niveau du code j'ai fait ceci pour lire le nombre de descripteurs de fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    FILE *fp = NULL;
    	UInt16 numFd = 0;
    	int c;
     
    	fp = fopen("/proc/self/fd", "r");
    	if(fp == NULL)
    		printf("---Reading error of /proc/self/fd file---\n");
     
    	while ((c = fgetc(fp)) != EOF)
        {
       		numFd++;
       		printf("Numéro fd = %d		nombre fd = %d\n",c,numFd);
        }
    	fclose(fp);
    Malheureusement, je tombe dans le message d'erreur car fp == NULL et je ne comprends pas pourquoi...Auriez vous une idée?

    Merci

    Nicolas
    Peut être parce qu'il s'agit d'un "répertoire", même si tout est fichier en Unix/Linux. opendir() / readdir() ?

    A+

  7. #7
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Bonjour,

    Concernant la détermination du nombre file descriptor ouvert, j'ai une remarque à faire.

    Lorsque nous allons dans le chemin comme indiqué précedemment, nous obtenons ceci:
    frcesw0050049 <67:ndelh>pwd
    /proc/self/fd
    frcesw0050049 <68:ndelh>ls
    0 1 15 16 17 18 19 2
    Nous observons donc l'id de chaque file descriptor mais nous ne savons combien de fois un fd spécifique est en activité. ce que je veux dire, c'est que dans l'application, il est possible que le 17 soit ouvert deux fois, voire plus, et en cours en même temps.

    Pour illustrer cet effet, une fonction vxworks permet d'afficher la liste des noms de fd ouvert dans le système et on obtient le résultat suivant:
    fd name drv
    3 /tyCo/0 1 in out err
    4 (socket) 4
    5 (socket) 4
    6 /bpf/dhcpc-arp0 5
    7 (socket) 4
    8 (socket) 4
    9 (socket) 4
    10 /nvm/swat 12
    11 /msg/select0xb7b40c8 13
    12 /msg/select0xb7aebb8 13
    13 /msg/select0xb7a4268 13
    14 (socket) 4
    15 (socket) 4
    16 /dev/poe 15
    17 /dev/localswitch 16
    18 /dev/mac/line0 17
    19 /dev/mac/line1 17
    20 /dev/ip 18
    21 /dev/ipge/umbrella 19
    22 (socket) 4
    23 /dev/ipge/umbrella 19
    24 /dev/ipge/umbrella 19
    C'est une constation, peut être une explication à cela?

    Sinon il est à noter que je télécharge l'application sur un système embarqué composé de l'os vxworks et qu'une fois l'application lancée, je ne peux avoir accés à seulement la mémoire de la target. Ceci expliquerait surement le fait, que j'ai eune erreur d'ouverture pour lire le fichier "/proc/self/fd".

    Voilà. Sinon j'ai tout de même trouvé un moyen de compter ce nombre de fd ouverts en utilisation des spécificités de vxworks.

    Nicolas

  8. #8
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    J'ai peut être parlé un peu trop vite...Car les IDs de fd changent même si on ouvre le même driver.

    Donc si ca trouve, peut être que sous le chemin donné, on les observerait tous. Désolé si c'est bien cela pour ma remarque hâtive.

Discussions similaires

  1. Obtenir le nombre de page total
    Par crawling5 dans le forum Jasper
    Réponses: 4
    Dernier message: 31/07/2009, 12h05
  2. [DisplayTag] [Pagination] Obtenir le nombre total de pages ?
    Par ghost0408 dans le forum Taglibs
    Réponses: 0
    Dernier message: 15/05/2009, 14h29
  3. Comment obtenir la somme et le nombre total d'un champ avec SQL ?
    Par ghazaliove dans le forum Bases de données
    Réponses: 3
    Dernier message: 01/05/2008, 21h32
  4. Export : Obtenir le nombre total de lignes exportées
    Par ilalaina dans le forum Import/Export
    Réponses: 6
    Dernier message: 20/12/2007, 10h46
  5. Réponses: 2
    Dernier message: 15/11/2006, 10h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo