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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Pipefehler unter Solaris 10 X86

Die Seite wird geladen...

Pipefehler unter Solaris 10 X86 - Ähnliche Themen

  1. 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!! ->...
  2. androis-apps unter Linux ausführen

    androis-apps unter Linux ausführen: Hallo Welche Möglichkeiten habe ich, um unter Linux (Debian) Android-apps (hier ein Spiel *.apk ? ) auszuführen ? Einen Android-emulator hab...
  3. OpenJDK8 unter Debian7.11/sparc64/kernel 3.16 kompilieren

    OpenJDK8 unter Debian7.11/sparc64/kernel 3.16 kompilieren: Hallo zusammen Habe vor das OpenJDK8 unter Debian 7.11 (mit Kernel 3.16.x aus wheezy-backports...) auf meiner Sun Ultra 45 zu kompilieren....
  4. Update auf Apache >=2.4.12 unter Debian Jessie

    Update auf Apache >=2.4.12 unter Debian Jessie: Hi, aufgrund eines Bugs in Apache 2.4 benötige ich zum Deployment von Seafile unter Debian Jessie das Paket apache2 in der Version >= 2.4.12...
  5. Was mache ich falsch? Tiniywm und Mate Install unter OpenBSD

    Was mache ich falsch? Tiniywm und Mate Install unter OpenBSD: Hallo, # make tiny make: don't know how to make tiny Stop in /root/Downloads/tiny/tinywm-1.3 # make tinywm cc -O2 -pipe -o tinywm tinywm.c...