Pipefehler unter Solaris 10 X86

Diskutiere Pipefehler unter Solaris 10 X86 im C/C++ Forum im Bereich Programmieren unter Linux/Unix; Liebe UNIX und C++ Gurus, ich habe ein Problem, bei dem ich nicht mehr weiter weiss. Vereinfacht gesagt, soll ein zu übergebenes UNIX Kommando...

  1. #1 mario.horny, 15.09.2008
    Zuletzt bearbeitet: 15.09.2008
    mario.horny

    mario.horny Grünschnabel

    Dabei seit:
    15.09.2008
    Beiträge:
    1
    Zustimmungen:
    0
    Liebe UNIX und C++ Gurus,

    ich habe ein Problem, bei dem ich nicht mehr weiter weiss. Vereinfacht gesagt, soll ein zu übergebenes UNIX Kommando mittels exec(...) ausgeführt werden. Da exec() ja nicht zurückkehrt, geschieht das ganze mittels eines fork() und eines Childprozesses. Der Parent soll die Möglichkeit haben, dem exec() Daten mit zu übergeben. Deshalb leitet der Child sein stdin in eine Pipe um, die vom Parent gefüttert wird.

    Hier das vereinfachte Codesnippet:

    if( pipe(m_inPipe) < 0){...}

    // do the fork
    pidChild = fork();

    // if fork fails, don't go further
    if(pidChild < 0) {...}


    if(pidChild == 0)
    { // CHILD

    // close the pipe side that is definitly not needed by the child
    ::close( m_inPipe[STDOUT_FILENO] );

    // redirect stdin of child
    ::close(STDIN_FILENO);
    dup2(m_inPipe[STDIN_FILENO],STDIN_FILENO);

    // close remaining pipe side since not needed anymore
    ::close( m_inPipe[STDIN_FILENO] );

    // execute the command (can be unix cmd or shell script)
    execl("/usr/bin/ksh", "ksh", "-c", command.c_str(), NULL);

    exit (ERROR);
    }
    else
    { // PARENT

    // close the pipe side that is not needed by the parent
    ::close( m_inPipe[STDIN_FILENO] );

    // write command input to pipe (content that is to be redirected into the cmd executed by child)
    noBytes = ::write( m_inPipe[STDOUT_FILENO], m_inpMsg.c_str(),m_inpMsg.size());

    // log if an error occured
    if( noBytes < 0 ) {...}

    // close the used pipe end
    ::close( m_inPipe[STDOUT_FILENO] );


    } // end parent


    Das ganze klappt auch per se. Wenn das snippet unter Solaris 10 auf X86 4-mal hintereinander aufgerufen wird, ist alles prima, beim 5. mal bricht das Programm ohne core File ab. Dabei habe ich 2 Varianten eingrenzen können:

    a) Wenn der Child schon auf dem exec() hockt, bevor der Parent die Daten über die pipe in das stdin des Childsschaufelt, beendet sich mein Prozess augenblicklich (wie gesagt, ohne core) mit einer Fehlermeldung.
    b) Wenn der Parent mit dem Schreiben schon durch ist und der Child dann erst auf das exec() läuft, wird auch eine Fehlermeldung ausgegeben, allerdings bleibt der Prozess stabil und beendet sich nicht.

    Die Fehlermeldung ist in beiden Fällen "X: bad number". Mir stellen sich momentan dazu einige Fragen:

    + Wieso funktioniert das ganze einigemale, dann aber nicht mehr ? Habe ich hier ein Synchronisationsproblem, evtl. in Abhängigkeit vom schließen der Pipeenden ?

    + Wie kann es sein, dass der Prozess sich beendet, wenn der Child schon auf dem exec() hängt, bevor der Parent seine stdin über die Pipe füttert ? Sollte nicht zumindest ein core existieren ?

    + Die Fehlermeldung "X: bad number" ist mir schleierhaft. Sowohl in den übergebenen Daten, als auch in dem Command befindet sich kein "X". Kann es sein, dass das Betriebssystem beim Aufruf von exec() das environment des users ausführt und der Fehler irgendwo daher kommt ?

    + Unter Solaris 10 auf SPARC tritt der Fehler auch auf, aber nur _sehr_ sporadisch und nicht reproduzierbar. Seit ich nun den Port auf X86 gemacht habe, ist der Fehler wie gesagt reproduzierbar, was mir aber auch nicht weiterhilft.

    Ich wäre euch sehr dankbar, wenn ihr ein wenig Licht in mein Dunkel bringen könntet. Vielen Dank schon im Voraus.

    Viele Grüße,
    Mario
     
Thema:

Pipefehler unter Solaris 10 X86

Die Seite wird geladen...

Pipefehler unter Solaris 10 X86 - Ähnliche Themen

  1. Robots aussperren, Websitescan unterbinden, PHP Checkbox-Captcha?

    Robots aussperren, Websitescan unterbinden, PHP Checkbox-Captcha?: Hallo zusammen, ich hätte gerne einen bestimmten Bereich der Webseite, den Robots oder scriptbasierte Scans von irgendwelchen Suchmaschinen oder...
  2. [gelöst] 2.HDD unter Freebsd partitionieren

    [gelöst] 2.HDD unter Freebsd partitionieren: Hallo Habe eine Testserver mit freeBSD 11.0 auf einer IDE-HDD (ada0) mit ZFS-root hab jetzt eine 2. HDd (SATA) angeschlossen und wollte die...
  3. Installation von COM Ports unter Unix

    Installation von COM Ports unter Unix: Hallo, vorne weg, ich habe von Linux nur Grundkenntnisse und bitte daher etwas um Rücksicht, wenn ich doofe fragen stelle;). Zum Problem: Es gibt...
  4. Samba 4 trennt sich beim Übertragen unter Windows7/10

    Samba 4 trennt sich beim Übertragen unter Windows7/10: Hallo zusammen Mir ist nun schon ein paar Mal aufgefallen dass sich mein Samba-Server (Debian 8.7.1 + backports-Kernel v4.9.x) "einfach so", ohne...
  5. Gigabit PCI Ethernet Card welche unter Kernel 3.16 läuft?

    Gigabit PCI Ethernet Card welche unter Kernel 3.16 läuft?: Hallo zusammen Bezüglich diesem Problem habe ich nun eine neue PCI Gigabit Ethernet Card gekauft, jedoch zeigt mit lspci REIN GAR NIX an!! ->...