【发布时间】:2011-07-14 00:25:13
【问题描述】:
我创建了一个 pthread,并在其中安装了一个信号处理程序,就像我们在 main( ) 函数中所做的那样。线程的信号处理程序是一个单独的函数。令人惊讶的是,它不起作用,即线程的信号处理程序无法捕获信号。
代码如下:
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <signal.h>
#include <string.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);
}
输出:
分段错误(表示信号未被处理程序捕获)
【问题讨论】:
-
首先并继续@sarnold 所说的,您使用了错误的 API。不要使用
signal()。从手册页(阅读):“未指定多线程进程中 signal() 的效果。”在 man 2 sigaction 开始阅读文档。 -
@rlibby:那么我应该使用“struct sigaction”还是“sigevent 结构”来捕捉信号,你的意思是?