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 :

Executer des commandes shell + recuperation


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut Executer des commandes shell + recuperation
    Bonjour je souhaiterais exécuter des commandes shell en c et récupérer le résultat. Je sais que grâce à la commande system() on peut en exécuter mais comment pouvoir récupérer les données ? ou reprendre la main sur le programme après le fameux system()?

    NB: la commande en question est un cat

    Toute aide est apprécié, merci.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Cette question est déjà traitée dans la FAQ.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut
    J'avais déjà vu popen() mais malheureusement je n'arrivais pas à récupérer les données contrairement à system()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	//system
    	fichier = fopen(FILENAME, "w+");
    	char *commande ="cat -A /dev/ttyUSB0 > file.txt";
    	printf("Attente de prise de la valeur \n");
    	system(commande);	
     
    	if (fichier != NULL){				
    		fgets(chaine,TAILLE,fichier);
    		printf("chaine : %s \n",chaine);
    	}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	//popen	
    	FILE* fp; 
    	char chaine[TAILLE]="";
    	char *commande ="cat -A /dev/ttyUSB0";
    	fp = popen(commande, "r");
     
    	while ( fgets( chaine, sizeof chaine, fp)){
    		printf("%s", chaine);
    	}
    	pclose(fp);
    Par contre il me reste toujours le problème de la perte de prise en main du programme après exécution des commandes.

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 148
    Par défaut
    Tu fork et puis c'est terminé...


  5. #5
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par Deskwisk Voir le message
    Bonjour je souhaiterais exécuter des commandes shell en c et récupérer le résultat. Je sais que grâce à la commande system() on peut en exécuter mais comment pouvoir récupérer les données ? ou reprendre la main sur le programme après le fameux system()?

    NB: la commande en question est un cat

    Toute aide est apprécié, merci.

    Si la commande est un cat, pourquoi ne pas ouvrir simplement le fichier pour le lire directement dans ton programme C?

    C'est une question un peu bête, mais on ne sais jamais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void cat(char *fn)
    {
      int nb;
      int fd;
      char *buffer;
     
      fd = open(fn, O_RDONLY);
      buffer = (char *) malloc(sizeof(char) * 512);
      while ((nb = read(fd, buffer, 512)) > 0)
          write(1, buffer, nb);
      close(fd);
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut
    Disons que j'avais essayer d'ouvrir et de lire le port mais sans résultat. Le problème est que je dois attendre une mesure et donc aucune donnée n'est présente au début. Alors j'ai utilisé un fork() et la une fois de plus aucun résultat. (Mais le problème vient peut être du programme en lui même ?)

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void cat(char *fn)
    {
      int nb;
      int fd;
      char *buffer;
     
      fd = open(fn, O_RDONLY);
      buffer = (char *) malloc(sizeof(char) * 512);
      while ((nb = read(fd, buffer, 512)) > 0)
          write(1, buffer, nb);
      close(fd);
      printf("%s", buffer);
    } 
     
    int main(){
    	int i=0;
    	int pid;
    	if ((pid = fork()) > 0) {
    		while(i<=30){
    			i++;
    			printf("%d \n",i);
    			cat("ttyUSB0");
    			sleep(5);
    		}
    	}
    	return 0;
    }

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Au lieu de forker tu peux aussi ouvrir ton fichier en mode non bloquant (et regarder de temps en temps si quelque chose se passe).

    Tu peux aussi jouer sur les propriété du file descripteur à l'ouverture pour avoir les paramètres les plus approprié a ton périphérique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
    Autrement tu peux essayer de le combiner le read avec select pour attendre que des données soient présente sur le port.

    http://www.linux-kheops.com/doc/man/.../select.2.html

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut
    Merci pour la fonction select , je la connaissais pas et elle est bien pratique et cela m'a permis de lire au bon moment et ainsi de récupérer les données.
    Par contre la fonction read() me renvoie certain caractère non lisible. Alors si quelqu'un a une solution ?

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

Discussions similaires

  1. Erreur utilisation des commandes shell
    Par paolo2002 dans le forum Windows XP
    Réponses: 7
    Dernier message: 05/11/2006, 14h09
  2. execute une commande shell en java
    Par freakfm dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 07/10/2006, 17h03
  3. utilisation des commandes shell dans un programme C
    Par rasgueados dans le forum Linux
    Réponses: 15
    Dernier message: 03/08/2006, 17h25
  4. executer des commandes
    Par hawaks dans le forum Général Python
    Réponses: 3
    Dernier message: 17/12/2005, 12h41
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

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