He creado un pthread e instalado un controlador de señales dentro de él, del mismo modo que lo hacemos en la función main()
. El manejador de señal del hilo es una función separada. Sorprendentemente, no está funcionando, es decir, el manejador de señal del hilo no puede captar señales.Manejo de señales en pthreads
Aquí está el código:
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <signal.h>
typedef struct data
{
char name[10];
int age;
}data;
void sig_func(int sig)
{
printf("Caught signal: %d\n",sig);
signal(SIGSEGV,sig_func);
}
void func(data *p)
{
printf("This is from thread function\n");
signal(SIGSEGV,sig_func); // Register signal handler inside thread
strcpy(p->name,"Mr. Linux");
p->age=30;
sleep(2); // Sleep to catch the signal
}
int main()
{
pthread_t tid;
pthread_attr_t attr;
data *ptr;
pthread_attr_init(&attr);
pthread_create(&tid,&attr,(void*)func,ptr);
pthread_kill(tid,SIGSEGV);
pthread_join(tid,NULL);
printf("Name:%s\n",ptr->name);
printf("Age:%d\n",ptr->age);
}
Salida:
Fallo de segmentación (que significa que la señal no está sujeta al manejador)
Ha descubierto que [los hilos y las señales no interactúan bien] (http: // stackoverflow.com/questions/2575106/posix-threads-and-signals) :) – sarnold
Para empezar, y para continuar lo que dice @sarnold, estás usando la API incorrecta. No use 'signal()'. Desde la página man (* read it *): "Los efectos de signal() en un proceso multiproceso no están especificados". Comience a leer documentos en el hombre 2 sigaction. – rlibby
@rlibby: Entonces, ¿usaré la estructura "struct sigaction" o "sigevent" para captar las señales, quieres decir? – kingsmasher1