hauptprogramm anhalten bis execv erfolgreich gestartet wurde



  • Hi,

    ich hoffe ihr könnt mir hierbei helfen.

    möchte in einem extra prozess(child) ein programm starten, und danach mittels schreibener pipe dem kind daten an stdin senden.

    Soweit funktioniert das auch, aber falls aus unerklärlichen gründen das programm (in exec) nich gestartet werden konnte, läuft das hauptprogramm trotzdem weiter und versucht in die pipe zu schreiben. Und dann kommt nen "Broken Pipe".

    Kann ich prüfen ob die Pipe noch verbunden ist?

    Oder kann ich es irgendwie anders programmieren als so? (siehe unten)

    hab jetzt auch mal nen SIGCHLD Handler programmiert. Aber der wird nur aufgerufen, wenn ich im Hauptprogramm künstlich ein sleep einbaue. Da wohl sonst das Hauptprogramm schneller beendet ist, als der handler anfangen kann zu arbeiten.

    #define TXT "hier spricht der parent prozess\n"

    void catchsignal(int sig) {
    int status;
    int retval;

    if (waitpid(-1, &status, WNOHANG) < 0) {
    fprintf(stderr, "error waiting for childprocess\n");
    }

    retval = WEXITSTATUS(status);
    if (retval == 120) {
    fprintf(stderr, "exec failed\n");
    } else if (retval > 0) {
    fprintf(stderr, "programm hat einen fehler zurückgegeben.\n");
    }

    printf ("Signal aufgetreten\n");
    exit(1);
    }

    int main (int argc, char *argv[]) {
    int pipes[2];
    int c;
    int pid;

    signal(SIGCHLD, catchsignal);
    //signal(SIGPIPE, catchsignal);

    if (pipe(pipes)) {
    fprintf(stderr, "can't pipe()\n");
    return -1;
    }

    switch (pid = fork()) {
    case -1:
    fprintf(stderr, "vfork() failed\n");
    return -1;
    case 0: /* start child */
    dup2(pipes[0], 0);
    close(pipes[1]);
    execv("write", NULL);
    _exit(120);
    }

    /* parent */
    close(pipes[0]);

    /* warte ob exec erfolgreich war, bevor geschrieben wird */
    //sleep(1);

    printf ("Schreibe Daten.\n", pipes[1]);
    write(pipes[1], TXT, strlen(TXT));

    close(pipes[1]);

    //wait(NULL);
    return 0;
    }

    fall a) sleep und wait auskommentiert. Ausgabe:
    Schreibe Daten
    fall b) sleep(1) (kein wait) Ausgabe:
    exec failed
    Signal aufgetreten
    fall c) kein sleep aber ein wait(null) Ausgabe:
    Schreibe Daten.
    error waiting for childprocess
    Signal aufgetreten

    ich würd ganz gern nach dem execv warten bis das programm vollständig gestartet wurde und auf stdin hört. Falls das programm abbricht und der exit code 120 übermittelt wird soll eine fehlermeldung ausgegeben werden und das hauptprogramm beendet werden, ohne das in die pipe geschrieben wird.

    Grüße Jan



  • mit signal(SIGPIPE, SIG_IGN) verhinderst du den abbruch durchs signal. Stattdessen bekommst du von read/write den entsprechenden fehlercode zurück.



  • Danke


Anmelden zum Antworten