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

C Discussion :

Récupérer résultat commande linux en C


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Récupérer résultat commande linux en C
    Salut à tous !

    Après avoir cherché sur internet, j'ai réussi à trouver quelques pistes à la résolution, mais pas la solution finale !

    Mon problème:
    J'écris un programme en C, et j'aimerais récupérer dans mon programme le nombre de fichiers contenu dans un dossier spécifique. Pour cela, j'avais tout d'abord pensais à faire un script shell, mais étant débutant je n'ai pas vraiment réussi à faire ce que je voulais.
    J'ai ensuite découvert la commande , et j'en suis donc arrivé au code suivant:
    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
    16
    17
    18
    int nb_descripteurs(){
        int nb;
        FILE *ptr;
     
        ptr = fopen("mon_repertoire/NB_DESCRIPTEUR.txt","w");
     
        fprintf(ptr,"%d",system("ls mon_repertoire | wc -l"));
     
        fscanf(ptr,"%d",&nb);
     
        return (nb);
    }
     
    int main()
    {
        printf("%d", nb_descripteurs());
        return 0;
    }
    Voilà mais le soucis ici c'est que lorsque que j'exécute mon programme, je me retrouve avec affiché à l'écran:1 étant le nombre réel de fichiers présent, "calculé" par la commande linux, et 0 étant la valeur de la variable nb.

    Quelqu'un aurait-il une solution pour enregistrer correctement 1 dans ma variable nb s'il-vous-plaît ?

    Merci beaucoup !

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par RedArrrow Voir le message
    Quelqu'un aurait-il une solution pour enregistrer correctement 1 dans ma variable nb s'il-vous-plaît ?
    Pas si simple du tout

    Passer par system() pour exécuter une requête est trop complexe à exécuter.
    La valeur retournée n'a à ma connaissance aucun rapport avec l'action effectuée (le script est exécuté comme un process parallèle, donc la fonction system() ne peut en aucun cas indiquer un retour de script!)

    Pour compter des fichiers dans un répertoire, il existe des fonctions C implicitement faites pour cela, mais dépendent de bibliothèques propriétaires. Par exemple voir dirent.h avec opendir(), readdir() et closedir(), ou d'autres.

    Il est aussi possible d'exécuter un process avec attente du résultat avec spawn (voir
    http://c.developpez.com/faq/?page=Ge...veau-processus), mais la récupération du résultat ne peut pas se faire avec un simple scanf(), il faudrait rediriger la sortie du traitement vers un fichier et ensuite le relire.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    La fonction que tu cherches est popen() http://manpagesfr.free.fr/man/man3/popen.3.html Tu dois en revanche bien connaitre le format de sortie de ta commande pour réussir à analyser le résultat.

    Tu peux aussi t'intéresser aux fonctions permettant de réaliser les opérations qui t'intéresse. Sous Linux tu auras accès sans problème aux fonctions Posix citées pardalfab.

    EDIT : J'ai récupéré un PC, voici un exemple de popen() :

    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
    16
    17
    #include <assert.h>
    #include <stdio.h>
    #include <stdbool.h>
     
    #define LINE_MAX_LENGTH	512
     
    int main(void)
    {
    	FILE *f = popen("ls -lrt", "r");
    	assert(f != NULL);
     
    	char line[LINE_MAX_LENGTH] = {0};
    	while(fgets(line, LINE_MAX_LENGTH, f) != NULL)
    	{
    		printf("%s", line);
    	}
    }
    Il affiche dans mon cas :
    total 16
    drwxr-xr-x  3 pierregradot  staff   102 Nov 15  2014 resources
    -rw-r--r--  1 pierregradot  staff   757 Nov 28 11:44 Copy of dna.txt
    drwxr-xr-x  7 pierregradot  staff   238 Nov 28 12:35 src
    -rw-r--r--  1 pierregradot  staff  1961 Nov 29 18:58 dna.txt
    drwxr-xr-x  7 pierregradot  staff   238 Dec 27 20:49 Debug

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup à tous les deux pour votre aide !
    Après plusieurs essais, je me suis tourné vers la fonction popen qui correspond parfaitement à mes attentes !

    Je vous suis infiniment reconnaissant, merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer les résultats d'une commande linux dans une base de données
    Par fatimazahra kachiri dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/04/2014, 13h14
  2. Réponses: 5
    Dernier message: 08/11/2011, 21h43
  3. Récupérer résultat de la commande find
    Par saraouan dans le forum Linux
    Réponses: 2
    Dernier message: 27/04/2010, 23h46
  4. Récupérer résultat commande nc
    Par ensi2007 dans le forum Linux
    Réponses: 1
    Dernier message: 22/10/2009, 08h10
  5. Récupérer résultat d'une commande dos
    Par cem40 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/08/2008, 09h17

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