2016-04-08 7 views
0

Ich habe eine App, in der der Elternprozess ein paar Threads (Plugins) startet. Und einer von ihnen startet in regelmäßigen Abständen einen Kindprozess und liest seine Ausgabe über eine Pipe unter Verwendung der popen.Wie verhält sich ein Kind Piped-Prozess auf Signal an ein Elternteil?

Weiterhin kann der übergeordnete Prozess von SIGUSR1 gestoppt werden. Alle Plugins halten gut an, außer dem, der die Pipe benutzt: Sie wirft den SIGSEGV irgendwo in eine read Funktion.

Ich denke, das ist, weil der Kindprozess auf SIGUSR1 auch stoppt, so dass die Pipe ungültig werden. Habe ich recht? Wie kann ich dieses Problem lösen?

+0

Können Sie bestätigen, dass der Elternprozess von SIGSEGV durch einen Leseaufruf beendet wird? –

+0

@ZangMingJie, ja, aber es wird nicht tatsächlich getötet, weil es einen Handler für Signale gibt. In irgendeiner Weise hat der Elternprozeß den SIGSEGV erhalten, während er das 'Lesen' in Bearbeitung aufgerufen hat. –

Antwort

0

Es sieht aus wie der Fehler verursacht die SIGSEGV an einem anderen Ort war: jemand vor mir programmiert hatte eine unload Funktion auf diese Weise:

void unload() 
{ 
    stop_main_thread = 1; 
    usleep(100000); 
    LibLog::print("modem is disconnected"); 
} 

, während die Thread-Funktion hat einen Anruf usleep(pause) wo die pause wird auf 500000.

Die Funktion unload wird in einer der gemeinsam genutzten Bibliotheken abgelegt und aufgerufen, wenn ein Programm heruntergefahren wird. Also, wenn die unload Funktion fertig ist, so-Datei wird entladen die Thread-Funktion versuchen, noch etwas mit dem bekannten Ergebnis zu tun.

Ändern der usleep Anruf in der unload an die pthread_join löst mein Problem.