Interprocesskommunikation mittels einer Pipe



  • Hi zusammen,

    es geht darum, dass ich ein Bash Script in einem Unterprozess starten will, die Ausgabe des Bash Scriptes soll nun in den Elternprozess umgeleitet werden. Dort soll dann bei Ausgabe was passieren.
    Dass ich mit fork() und execv() den Subprozess kreieren und auch starten kann hab ich schon hinbekommen. Ne Pipe hab ich denke ich auch richtig etabliert. Irgendwie fehlt mir nun aber der entscheidende Schritt zum Event bei Ausgabe. Macht man das mit signals wenn ja wie?
    Hier mein bissheriger Code, nehme auch gerne Anmerkungen zu jenem entgegen. Der signal() Aufruf produziert folgenden Fehler:

    error: void value not ignored as it ought to be

    void start() //Startet den Unterprozess
    
     pid_t pid;
     int burnpipe[2];
    
     if(pipe (burnpipe))
      QMessageBox::critical( this, tr("TestProgramm"),
        tr("Failed to create Pipe.\n Too many file open."));
     pid=fork();
     if(pid==0){
      dup2(burnpipe[1],fileno(stdout));
      execv("./createcd.sh",NULL);
     }
     else if(pid < 0)
      QMessageBox::critical( this, tr("TestProgramm"),
        tr("Script to burn CD could not be started.\n Please check memory."));
     else{
      dup2(burnpipe[0],fileno(stdout));
      signal(SIGTTOU,readFromStdout()); //produziert fehler
     }
    }
    
    void readFromStdout() //soll bei Ausgabe nach stdout des Unterprozess aufgerufen werden
    {
    }
    

    PS: Nicht wundern ist ein QT Projekt, bloss die Frage hat ja nix mit QT sondern mit C zu tun, deswegen in dem Forum. QProcess hatte ich auch schon probiert, allerdings gibt es da Probleme mit dem Auslesen von StdOut.



  • Probier's mal so:

    signal(SIGTTOU,readFromStdout); // ohne Klammern ()
    

    Abgesehen davon: Eine QT-Applikation zu forken ist vielleicht nicht die beste Idee. Bei fork() werden alle Threads des Prozesses und alle Filehandles (sofern nicht anders eingestellt) verdoppelt.

    Nimm einen Thread, wenn Du den Code parallel zur Applikation laufen lassen willst.

    Pipes werden unter UNIX mit mkfifo() angelegt und dann mit open()/read()/write()/close() bedient.

    Die Funktion pipe() wird tatsaechlich nur bei der fork()/execve() Orgie gebraucht. 😉


Anmelden zum Antworten