Ho creato un pthread e installato un gestore di segnale al suo interno, proprio come facciamo nella funzione main()
. Il gestore di segnale del thread è una funzione separata. Sorprendentemente, non funziona, cioè il gestore del segnale del thread non è in grado di rilevare i segnali.Gestione del segnale in pthreads
Ecco il codice:
#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);
}
uscita:
Segmentation fault (che significa che il segnale non è catturato dal gestore)
Hai scoperto che [thread e segnali non interagiscono correttamente] (http: // stackoverflow.it/questions/2575106/posix-threads-and-signals) :) – sarnold
Per iniziare, e per continuare ciò che @sarnold ha detto, stai usando l'API sbagliata. Non usare 'signal()'. Dalla pagina man (* read it *): "Gli effetti di signal() in un processo con multithreading non sono specificati." Inizia a leggere i documenti a man 2 sigaction. – rlibby
@rlibby: Quindi dovrei usare la "struct sigaction" o "sigevent structure" per catturare i segnali, vuoi dire? – kingsmasher1