2011-06-06 12 views
7

Estoy escribiendo un programa multiproceso en el que quiero manejar un posible comando Ctrl-C del usuario para finalizar la ejecución. Por lo que sé, no hay garantía de que el hilo principal, que puede cancelar todos los hilos de trabajo, capte la señal. Por lo tanto, ¿es necesario tener un manejador de señal diferente al código del hilo de trabajo para que cualquier persona capte la señal si llega, o hay otra manera de hacerlo con un manejador de señal solo en el código del hilo principal?capturando SIGINT en un programa multiproceso

Respuesta

8

Puede bloquear las señales del hilo de llamada con pthread_sigmask().

Y, como las señales bloqueadas se heredan a los subprocesos recién creados, puede bloquear SIGINT en el hilo principal, luego lanzar sus otros hilos y luego desbloquearlo en el hilo principal, si es preferible.

+0

pero de esta manera no se va a perder una señal de sigint si un hilo hijo pasa a atraparlo y simplemente lo ignora? – nikos

+1

@nikos: Sí, pero no veo la relación con lo que estaba escribiendo; Si un hilo bloquea una señal, no puede, por definición, atraparlo. – janneb

+1

@nikos: nunca se envía una señal a un hilo que lo tiene bloqueado (por ejemplo, usando 'pthread_sigmask()'); esto es diferente de la captura del hilo y lo ignora. Si todos los subprocesos bloquean el hilo principal tienen 'SIGINT' bloqueado, entonces siempre se entregará al hilo principal. – caf

Cuestiones relacionadas