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

    Posté par . En réponse au message Communication entre deux fichiers sous linux. É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 */