Pipefehler unter Solaris 10 X86

M

mario.horny

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
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Themen

Nginx als Reverse Proxy für Nextcloud und Emby

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

NagiosGrapher 1.7.1 funktioniert nicht

dovecot und postfix Konfiguration Problem

Windows clients können nicht mehr auf lange laufendes System zugreifen

Zurück
Oben