c - pthread 中的信号处理

标签 c pthreads signals

我已经创建了一个 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);
}

输出:

Segmentation fault (which means the signal is not caught by handler)

最佳答案

你的代码有几个问题:

  • ptr 没有初始化,所以所有的 ptr-> 部分都会导致程序崩溃
  • 您正在立即调用 pthread_kill(),很可能在安装信号处理程序之前,并且在线程中(具有未指定的行为)
  • 您从信号处理程序调用 printf(),但不能保证它会正常工作(有关安全函数列表,请参阅 man 7 signal)

虽然您仍然需要适当的线程同步,但是这会工作得更好,并且如其他地方所述,您应该使用 sigaction():

#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)
{
 write(1, "Caught signal 11\n", 17);
 signal(SIGSEGV,sig_func);
}

void func(data *p)
{
 fprintf(stderr, "This is from thread function\n");
 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 d;
 data *ptr = &d;

 signal(SIGSEGV,sig_func); // Register signal handler before going multithread
 pthread_attr_init(&attr);
 pthread_create(&tid,&attr,(void*)func,ptr);
 sleep(1); // Leave time for initialisation
 pthread_kill(tid,SIGSEGV);

 pthread_join(tid,NULL);
 fprintf(stderr, "Name:%s\n",ptr->name);
 fprintf(stderr, "Age:%d\n",ptr->age);
}

编辑:在主线程中安装 sighandler

关于c - pthread 中的信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5282099/

相关文章:

python - 向 Django 中长时间运行的方法发送信号

c - 等待来自多个进程的信号时 sigwait 有什么问题

c - 指向数组的指针与指向 'const' 数组的指针不兼容?

c++ - 为 std::vector<user-defined> 赋值

c - 如何更正 C 中的错误以自动翻译?

c - 使用 C 中的线程获取用户输入而不阻塞 while 循环

c - libcurl 中的段错误,多线程

创建带有前导空格的字符串数组

c - 将结构传递给 pthread_create,强制转换后未定义值?

Python 在两个 QThread 之间发送信号