Forum général.général Communication entre deux fichiers sous linux

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-4
11
avr.
2015

Bonjour à tous,

J'essaie de mettre en place une communication entre deux fichiers.
-acquisition.c :
1-reçoit en argument un int envoyé depuis interface.cpp
2-envoie deux tableaux 1D (ou un double pour commencer) -> création d'un tube nommé
-interface.cpp :
1-envoie de l'int au fichier acquisition.c
2-reception des deux tableaux 1D (ou un double pour commencer) -> lecture du tube nommé

Pour le moment j'arrive à envoyer un double depuis le fichier acquisition.c vers le fichier interface.cpp

Problème : Lancer l’exécutable Linux depuis le fichier interface.cpp

Tests :
1-utiliser la commande execl mais apparemment cela ne fonctionne pas bien et fait planter mon programme interface.cpp

2-On peut créer deux tubes nommés pour faire passer des données mais ça ne fonctionne pas, il doit manquer des signaux de contrôles ou autres!

Si vous avez d'autres solutions n'hésitez pas.

Merci d'avance

  • # lire le cours sur execl et sur les tubes nommés

    Posté par  . Évalué à 3.

    ca me parait etre l'idée de base.

    tel que decrit :
    - ca ressemble à un devoir à rendre dans la semaine
    - sans voir le code c'est difficile de dire ou ca se bloque.

    alors comme point de depart je te propose la page de man de execl

    en francais : http://www.linux-france.org/article/man-fr/man3/execv-3.html
    en anglais : http://linux.die.net/man/3/execl

    • [^] # Re: lire le cours sur execl et sur les tubes nommés

      Posté par  . Évalué à 0. Dernière modification le 13 avril 2015 à 10:02.

      Je m’intéresse à ça pour mon stage plutôt. J'ai besoin d'un .c pour récupérer des données depuis un matériel mais sa bibliothèque n'est pas compatible avec g++ …
      Du coup je dois scinder mon travail ! Quelle chance, ça me retarde un peu mais j'en apprends également.

      Je cherche a récupérer des données d'un fichier acquisition.c.
      1-Pour cela j'envoie des arguments depuis le programme interface.cpp vers acquisition.c avec la commande execl. Ça m'évite de créer un tube nommé et de traiter la chaine de caractères, en plus cette méthode ne fonctionne pas très bien malheureusement.
      2-Le programme acquisition.c fait l'acquisition des données et créé un tube nommé et écrit dessus.
      3-Le fichier interface.cpp vient lire le tube nommé.

      CODE :

      Syntaxe de execl :
      execl("chemin d'accès/prog","prog","arg1","arg2",…,NULL);

      Programme :

          #include "mainwindow.h"
          #include "ui_mainwindow.h"
      
          #include <stdio.h>
          #include <stdlib.h>
          #include <unistd.h>
      
          #include <iostream>
          #include <string>
          #include <fstream>
      
          #include <qwt_plot_curve.h>
          #include <QColorDialog>
      
          #include <fcntl.h>
          #include <stdio.h>
          #include <stdlib.h>
          #include <sys/stat.h>
          #include <sys/types.h>
      
          using namespace std;
      
          //CONSTRUCTEUR
          MainWindow::MainWindow(QWidget *parent) :
              QMainWindow(parent),
              ui(new Ui::MainWindow)
          {
              ui->setupUi(this);
          }
      
          //DESTRUCTEUR
          MainWindow::~MainWindow()
          {
              delete ui;
          }
      
          void MainWindow::on_pushButton_clicked()
          {
              execl("/home/jo-pc/Acquisition","Acquisition",temps_integration,NULL);
      
          //lecture du tube :
          double tmp2=0;
          cout << "essai3" <<endl;
          int fd2;
          FILE *fp2;
          cout << "essai4" <<endl;
          char *nomfich2="/home/jo-pc/Bureau/test2.txt", chaine2[50];
          cout << "essai5" <<endl;
          fd2 = open(nomfich2, O_RDONLY); /* ouverture du tube */
          cout << "essai6" <<endl;
          fp2=fdopen(fd2, "r"); /* ouverture du flot */
          cout << "essai7" <<endl;
          fscanf(fp2, "%s", chaine2); /* lecture dans le flot */
          cout << "essai8" <<endl;
          //tmp2 = strtod (chaine2,NULL);
          cout << "essai9" <<endl;
          cout << chaine2 << endl;
          cout << "essai10" <<endl;
          //printf("%lf\n",tmp2); /* affichage */
          unlink(nomfich2); /* fermeture du flot */
          cout << "essai11" <<endl;
      
          }

      Quelques warnings :

      mainwindow.cpp:86: avertissement : deprecated conversion from string constant to 'char*' [-Wwrite-strings]
               char *nomfich2="/home/jo-pc/Bureau/test2.txt", chaine2[50];
      ```                 ^
      
      Je compile avec g++ 64 bits sous QtCreator.
      
      Voila voila
      
      Pour le moment le programme se termine "subitement". Le programme s’arrête à l'affichage d'essai 7. Il ne passe pas cette ligne :     fscanf(fp2, "%s", chaine2); /* lecture dans le flot */
      • [^] # Re: lire le cours sur execl et sur les tubes nommés

        Posté par  (site web personnel) . Évalué à 3.

        Pour avoir joué il longtemps avec cela, il faut penser à flusher (flush) car les écritures se font en mode block généralement pour aller plus vite donc en général, l'autre programme ne reçoit jamais les données si elles sont petites…

        Dans ton cas, je n'ai pas regardé de près ton code. Désolé.

        • [^] # Re: lire le cours sur execl et sur les tubes nommés

          Posté par  . Évalué à 0.

          Ben j'ai juste l'appel du programme acquisition.c qui ne fonctionne pas.

          Si je lance les deux programmes separement ca fonctionne.

          Le tube nommé est écrit par acq.c et lu & affiché par interface.cpp

          Merci pour ta precision

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.