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 :

Capture de données : pipe ?


Sujet :

POSIX C

  1. #1
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut Capture de données : pipe ?
    bonjour,
    je voudrais réaliser un prog qui m'affiche des données en opengl. toute la partie opengl est ok mais il me manque la capture des données.
    un autre programme envoie des données vers celui qui les affiche. le truc, c'est que celui qui doit afficher, je ne sais pas comment lui dire de prendre les données.

    en gros, je voudrais faire un peu comme un prog lancé en ligne de commande avec des paramètres, mais sans avoir à relancer le prog à chaque fois pour actualiser les données...

    j'ai pensé à un pipe, mais je ne sais pas du tout comment mettre ça en place

    merci

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Salut,

    alors, il y a deux choses a faire: creer les pipes, et les ouvrir.
    pour les creer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <sys/stat.h>
    #include <sys/types.h>
     
    if ((n=mkfifo("le_nom_de_mon_pipe", 0666))==-1){
        perror("mkfifo\n");
        exit (1);
      }
    il faut ensuite les ouvrir pour recuperer un descripteut de fichier, de maniere a pouvoir utiliser les primitives write, read, etc....:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     if ((fd_cs=open("noçm_pipe", O_RDONLY))==-1){
        unlink("nom_pipe");
        perror("open\n");
        exit(1);
      }
    l idee etant de creer un pipe pour les echanges proc1-proc2, et un autre pour proc2-proc1....
    donc un seul de test processus crée les pipes, mais tous deux font un open de leur cote(sur un pipe donné, un proc l ouvre en lecture seule, et l autre en ecriture seule).

    ensuite, tu ecris et lis dedans avec write et read, comme un fichier normal.

    attention tout de meme: si un processus ouvre un pipe en lecture, il reste bloqué jusqu a ce que ce meme pipe soit ouvert en ecriture (par un autre processus, par exemple)

    voila!

    [edit]
    quand tu termine le prog, ne pas oublier de faire un close, puis un unlink
    [/edit]

    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    merci, ça fonctionne
    je l'ai un peu modifié pour pouvoir l'exploiter, mais ça fonctionne pas

    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
    /* Programme maitre : qui envoie les données */
     
    #include <sys/stat.h> 
    #include <sys/types.h>
    #include <stdio.h>
     
    main()
    {
    int n;
    FILE *fd;
    char buffer[10];
     
    unlink("mik");
    if ((n=mkfifo("mik", 0666))==-1)
    	{ 
    	perror("mkfifo\n"); 
    	exit (1); 
    	}
     
    if((fd=fopen("mik","w")) == NULL)
    	{
    	perror("file");
    	exit(1);
    	}
     
    while (1)
    	{
    	buffer[0]=112;
    	printf("buffer=%d\n",buffer[0]);
    	fputs(buffer,fd);
    	}
    }
    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
    /* Programme esclave : qui recoit les données */
     
    #include <sys/stat.h> 
    #include <sys/types.h>
    #include <stdio.h>
     
    main()
    {
    FILE *fd;
    char fichier[10];
    if((fd=fopen("mik","r")) == NULL)
    	{
    	printf("pb");
    	exit(1);
    	}
     
    while(1)
    	{
    	fgets(fichier,5,fd);
    	printf("fichier=%s\n",fichier);
    	}
    }
    résultat : dans la console du premier prog, il me renvoie toujours la valeur 112, ça c'est bon
    dans la console du deuxième prog, j'ai
    fichierp
    fichier=p
    fichier
    c'est moins normal il y a un problème quelque part, mais je ne vois pas où : quand je lance juste le programme esclave et que j'envoie des données manuellement sur le pipe avec, ça me renvoie le bon texte
    un problème de variable ?

    ps : je compte envoyer des données sous la forme d'une chaine de caractères "x1,x2,x3,x4,x5,x6,x7,x8,x9,x10" où x1 à x10 sont des variables float. c'est comme si je voulais faire passer un tableau int à mon autre prog.

  4. #4
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Salut,

    alors:
    1)il manque des includes (juste histoire d avoir une compilation propre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <stdlib.h>
    #include <unistd.h>
    tu peux toujours essayer de remettre a zero tes tableaux (utilise bzero qui est tres bien pour ca)

    ps : je compte envoyer des données sous la forme d'une chaine de caractères "x1,x2,x3,x4,x5,x6,x7,x8,x9,x10" où x1 à x10 sont des variables float. c'est comme si je voulais faire passer un tableau int à mon autre prog.
    rien ne t empeche de te definir une structure, et de l envoyer dans le pipe:
    quand tu ecris dans le pipe, tu n ecris rien d autre qu une suite d octets=> a toi de voir comment tu les interpretes....
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define TAILLE 80
    struct xchange{
      char msg[TAILLE];
    };
    #define MESS struct xchange
    et pour l envoi et la lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MESS mess;
    bzero(&mess, sizeof(MESS));
     
    read(fd_cs, &mess, sizeof(MESS));
    .....
    write(fd_sc, &mess, sizeof(MESS));
    et la, tu en fait ce que tu veux....

    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  5. #5
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    j'ai modifié le code (pas grand chose) et ça fonctionne
    dans le programme dit "maitre", j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (1) 
       { 
       buffer[0]=112; 
       printf("buffer=%d\n",buffer[0]); 
       fputs(buffer,fd); 
       }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (1)
    	{
    	sprintf(buffer,"moi");
    	fputs(buffer,fd);
    	}
    et ça fonctionne bien encore quelques trucs à modifier pour que ça passe comme j'ai dit précédemment et voilà

    je vais m'intéresser à ton code quand même
    merci

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

Discussions similaires

  1. Capture des données du port série
    Par pfrossard dans le forum Linux
    Réponses: 3
    Dernier message: 05/01/2011, 22h13
  2. Capture des données du port série
    Par pfrossard dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 20/12/2010, 12h20
  3. Réponses: 0
    Dernier message: 15/03/2010, 15h42
  4. Probleme pour Capturer une donnée
    Par sylvaindenisbe dans le forum IHM
    Réponses: 3
    Dernier message: 22/05/2007, 08h44
  5. Comment capturer les données sur une liaison série RS232
    Par jef Orome dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 02/04/2007, 18h14

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