2017-07-11 5 views
0

Ich habe die folgende Situation: Thread 1: Forks ein Kind und das Kind, sagen A wiederum gabelt sich wieder und führt einen Prozess. BIgnorieren/Blockieren SIGPIPE Signale in Multi-Thread-Linux-Programm

Thread 2: wartet auf Befehle über eine Unix-Domain-Socket und tötet den Prozess, B, die mit einem Kind, A in Thread 1 Respond gegabelt wurde Anrufer, dass es das Kind getötet hat

Ich mag SIGPIPE für Thread 2 zu ignorieren, da ich nicht möchte, dass das Programm abstürzt, wenn der Client den Socket geschlossen hat. Also habe ich versucht, diese

sigset_t set; 
sigemptyset(&set); 
sigaddset(&set, SIGPIPE); 
pthread_sigmask(SIG_BLOCK, &set, NULL); 

mit tun Dadurch Block SIGPIPE hilft, aber es blockiert auch die Fähigkeit des Fadens 1 SIGKILL, um das Kind zu senden.

I auch versucht, die unten in Hauptfunktion vor dem Erstellen von Threads

signal(SIG_IGN, SIGPIPE); 

und senden mit MSG_NOSIGNAL Flag in Buchse verwendet wird.

Das hilft auch meinem Szenario mit SIGKILL nicht. Irgendeine Idee, wie man das SIGPIPE in einem Multithread-Zustand wie oben sicher mit Gabeln und Execs und SIGKILLs ignorieren kann?

Antwort

0

Nach einigen Untersuchungen habe ich die Lösung gefunden. Ich musste
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
nach jedem fork() Anrufe und vor exec() im Enkel tun. Dies führte dazu, dass SIGKILL nicht blockiert wurde.