Pipefehler unter Solaris 10 X86

Dieses Thema im Forum "C/C++" wurde erstellt von mario.horny, 15.09.2008.

  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. 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...
  2. 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...
  3. Samba unter Windows 10

    Samba unter Windows 10: Hallo zusammen, ich habe auf meinen Ubuntu Server Samba installiert und eingerichtet. ich kann mich bei Windows 10 mit den Daten anmelden und...
  4. Netzwerkaufbau mit simulierten Paketen unter Linux

    Netzwerkaufbau mit simulierten Paketen unter Linux: Hallo, ich habe folgendes Problem. Da ich noch sehr unerfahren in Sachen Linux bzw. Netzwerkaufbau bin, wollte ich fragen, ob Ihr mir vllt etwas...
  5. Akonadi unterstützt Microsoft EWS

    Akonadi unterstützt Microsoft EWS: Krzysztof Nowicki hat eine initiale Unterstützung von Microsoft Exchange Web Services (EWS) für den KDE-Datenverwaltungsdienst »Akonadi«...