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

POSIX C Discussion :

Rediriger un flux de données sous linux


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut Rediriger un flux de données sous linux
    Bonjour,
    j'écris une application en c qui gére d'autres applications écrites C.
    Pour cela, je lance les applis en utilisant la fonction exec. Mais, je ne sais pas comment récupéré le flux de sortie de ces applications.

    Merci de répondre à cette question.

    Sébastien Nicaisse

  2. #2
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Un exemple:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    /* Lancement de ls et stockage de son resultat dans le fichier toto. Revient à faire ls>toto */
     
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(void){
      int fd;
     
      /* Ouverture fichier toto */
     
      if ((fd=open("toto", O_RDWR|O_CREAT|O_TRUNC,0644))==-1) {
        perror("Ouverture toto");
        exit(1);
      }
     
      /* Fermeture de la sortie standard */
      close(1);
     
      /* Redirection de toto sur la sortie standard */
     
      if (dup(fd) <0) {
        perror("Duplication");
        exit(1);
      } 
     
      /* Fermeture du descripteur fd */  
     
      close(fd);
     
      /* Recouvrement du process courant par le code de ls */
     
      execlp("ls", "ls", NULL);
     
      perror("Lancement ls");
     
      return(1);
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Mais, peut-on rediriger la sortie stadard sur l'application père directement sans passer par un fichier ?

    Merci de répondre à cette question.

    Sébastien Nicaisse

  4. #4
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Pas aisément via la mémoire (il faut mettre en place une zone de mémoire partagée et la synchroniser), mais facilement via un pipe.
    Je te transforme l'exemple précédent (non testé, donc pas à l'abri d'une petite erreur )

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    int main(void) {
      int i=0, tube[2];
     char ch[1024];
      FILE *in;
     
      if (pipe(tube) == -1) {
        perror("Ouverture pipe impossible");
        exit(1);
      }
     
      i=fork();
     
      if (i==0) {
        /* process fils */
        close(1); /* fermeture sortie std */
        dup(tube[1]);  /* redirection sortie std sur descripteur en ecriture du tube */
        close(tube[0]);  /* fermeture du descripteur inutilise */
        close (tube[1]); /* inutile de garder 2 descripteurs ouverts pour le meme fichier 
    		      tout acces sur la sortie std va deja  dans le tube */
        execlp("ls", "ls", NULL); 
      perror("Lancement ls"); 
    }
     
      else {
        /* process pere */
        close (tube[1]);
    if ((in=fdopen(tube[0], "r"))==NULL) { /* ouverture d'un flux associe a tube[0] plus pratique pour la lecture formattée*/
          perror("ouverture tube");
          exit(1);
        }
        fscanf(in,"%s", ch); // lecture du tube
        printf("%s\n", ch); 
      fclose(in);
      }
      return 0;
    }

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut Problème avec l'exemple précédent.
    Le problème de ce programme est qu'il affiche que le premier printf du fils mais pas ceux qui suivent.

    Merci de répondre à cette question.

    Sébastien Nicaisse

  6. #6
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Merci de bien vouloir utiliser la fonction recherche.

    http://www.developpez.net/forums/vie...highlight=pipe

    Tu as la reponse a ta question sur le dernier post.

    Merci

  7. #7
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Bien sûr, fscanf() s'arrête au 1er espace rencontré...

    Tu modifies avec ce que t'a donné Nyal, ca va marcher.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut [Probleme resolu]
    Bon excusez-moi, ça marche.

    Merci pour tout.

    Sébastien Nicaisse

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

Discussions similaires

  1. Configuration d'une base de donnée sous linux debian
    Par Boa_Guy_Serge dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 11/04/2008, 18h09
  2. Comment accèder aux données sous Linux ?
    Par lola06 dans le forum Réseau
    Réponses: 9
    Dernier message: 24/05/2007, 16h46
  3. Creer une base de donnée sous linux
    Par nissarte dans le forum Installation
    Réponses: 2
    Dernier message: 01/03/2006, 14h56
  4. Redirection du flux d'entree sous linux
    Par Fl4mBy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 30/08/2005, 15h49

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