2011-06-06 10 views
7

Sto scrivendo un programma multithread in cui voglio gestire un possibile comando Ctrl-C dall'utente per terminare l'esecuzione. Per quanto ne so, non c'è alcuna garanzia che il thread principale, che è in grado di cancellare ogni thread di lavoro, catturerà il segnale. È quindi necessario disporre di un diverso gestore di segnali per il codice del thread di lavoro in modo che chiunque catturi il segnale se arriva, o c'è un altro modo per farlo con un gestore di segnale solo nel codice del thread principale?cattura SIGINT in un programma con multithreading

risposta

8

È possibile bloccare i segnali dal thread chiamante con pthread_sigmask().

E, poiché i segnali bloccati sono ereditati dai thread appena creati, è possibile bloccare SIGINT nel thread principale, quindi avviare gli altri thread e quindi sbloccarlo nel thread principale, se è preferibile.

+0

ma in questo modo non si sta andando a perdere un segnale di sigint se un thread figlio capita di prenderlo e semplicemente lo ignora? – nikos

+1

@nikos: Sì, ma non vedo la relazione con ciò che stavo scrivendo; Se un thread blocca un segnale, non può, per definizione, catturarlo. – janneb

+1

@nikos: Un segnale non viene mai consegnato ad un thread che lo ha bloccato (ad esempio usando 'pthread_sigmask()') - questo è diverso dal thread che lo intercetta e lo ignora. Se tutti i thread escludono il thread principale, 'SIGINT' è bloccato, quindi verrà sempre consegnato al thread principale. – caf