[C++] Shared Library + system() = merkwürdiges Verhalten

_Grubi

Erfahrenes Mitglied
Hi,

ich stehe auch schon wieder vor dem nächsten Problem, was ich nicht gelöst bekomme. In einem der Shared Libraries benutzte ich "system()" um bestimmte Befehle auszuführen.

Mit
C++:
if(system(NULL))
{
   // system funktioniert ohne Probleme
}
else
{
  // ein Fehler ist aufgetreten
}
prüfe ich, ob ich system() verwenden kann, also ob ein "command processor" vorhanden ist. Wenn ich diesen Codeschnippsel in meinen Programm ausführe, läuft es ohne Probleme, habe ich ihn aber in einer Library drin, funktioniert es nicht mehr.
Der Befehl wird zwar ausgeführt, jedoch wird errno dabei auf 10 (ECHILD) gesetzt und ich bin nicht in der Lage zu prüfen, ob der Befehl erfolgreich ausgeführt wurde.

Hat von euch einer eine Idee, wieso es im Programm klappt, aber in meiner Library, die in genau dieses Programm via dlopen() geladen wird, nicht?

Gruß,
grubi
 
Hi!

Welches OS, welchen Compiler benutzt Du? Üblicherweise kann man ECHILD ignorieren, wenn system() dafür verantwortlich ist:
http://publib.boulder.ibm.com/infocenter/zos/v1r10/topic/com.ibm.zos.r10.bpxbd00/systm.htm hat gesagt.:
The new process finished before system() could call waitpid() to wait for the child process to end. This error can be ignored because the child process has already completed successfully and returned.

Gruß
Enum
 
Sorry, hab ich vergesen dazu zu schreiben.
Ich kompiliere unter Debian/Lenny mit libtool & g++

Signals behandle ich momentan noch keine außer SIGTERM. Von demher sollte es daran nicht liegen, da SIGCHLD (müsste dafür verantwortlich sein, oder?) normalerweise nicht ignoriert werden sollte. Ich werde es aber gleich einmal testen.


Edit:
Das Signal wurde tatsächlich ignoriert, warum auch immer. Nun habe ich jedoch das Problem, dass mir SIGCHLD mein Programm terminiert. Da muss ich mal noch suchen, wie ich ds verhindern kann.


Edit 2:
Habe mittlerweile herausgefunden, dass das Programm durch einen meiner Threads beendet wird. Ich verwende dort epoll in einem pthread und epoll_wait() wird ausgelöst, wenn ein Signal an den Thread gesendet wird. Diesen Fehlerfall hatte ich nicht behandelt. Aber wie kann ich bestimmte Signale für einen Thread deaktivieren? Ich habe es mit pthread_sigmask() probiert, aber die Signale werden dann im Programm generell ignoriert bzw blockiert.
 
Zuletzt bearbeitet:
Zurück