pthread 中的信号处理

2023-12-25

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

Output:

分段错误(这意味着信号没有被处理程序捕获)


您的代码存在几个问题:

  • 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);
}

Edit: 在主线程中安装ighandler

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pthread 中的信号处理 的相关文章

随机推荐

  • iOS 8 - 设置状态栏颜色(当您的导航栏背景图像为零时)

    我在我的应用程序中使用视图寻呼机 特别是 ICViewPager 要使视图寻呼机融入导航栏 如下所示 我必须将这些代码行放入我的AppDelegate m UINavigationBar appearance setBackgroundIm
  • 递归搜索给定名称的文件,查找特定短语的实例并显示该文件的路径

    我有一堆文件夹和子文件夹 除其他外 每个文件都包含一个名为index yml与有用的数据 我想搜索所有不同的index yml文件来查找搜索字符串的实例 我必须能够看到几行上下文和目录index yml找到的文件 这几乎有效 但它没有给我文
  • 有谁知道'top'命令的结果在android中的含义吗?

    我发现 top 的结果与标准linux中的结果不同 我在网上搜索了一下 但找不到答案 例如 以下是我的android中top的部分结果 PID CPU S THR VSS RSS PCY UID Name 814 2 R 1 940K 37
  • 你用过KMP或者BM算法吗?

    我知道KMP Knuth Morris Pratt 和BM Boyers Moore 算法都是很好的字符串搜索操作算法 我还知道BM比KMP快3 5倍 在您的行业软件编程经验中 您是否使用过BM或KMP算法 算法在这里真的很重要吗 如果你看
  • 纯虚方法调用错误

    我有以下定义 class PartitioningMethod public virtual void addConstraints ConstraintManager cm 0 virtual bool hasMoreConstraint
  • Pandas:如何根据不同列的值对列元素的组合进行分组以指示共现?

    我有一个以下形式的 pandas 数据框df Batch ID Product ID 1 A 1 B 1 C 2 B 2 B 2 C 2 C 3 B 3 B 3 C 4 C 4 D 5 D 我想从中获得一个边缘列表 本质上是一个新的数据框边
  • 我可以将 Prism 用于 WinUI 3 应用程序吗?

    我想在 WinUI 3 应用程序中使用 Prism 并且我看到了 Prism v8 1 版本 此外 Prism 8 1 还为那些希望使用 Uno 平台构建本机 WinUI3 或跨平台 WinUI 3 应用程序的用户提供了新的 Prism U
  • SparkSession.sql 和 Dataset.sqlContext.sql 有什么区别?

    我有以下代码片段 我想知道这两者之间有什么区别 我应该使用哪一个 我正在使用火花2 2 Dataset
  • 如何将手动插入和JPA Id生成结合起来?

    我正在使用 arquillian 运行容器内测试 我通过添加一个来预填充数据库import sql到部署 在测试期间我想创建更多实体 不幸的是 这失败了PersistenceException javax persistence Persi
  • 如何在 Jetpack Compose Canvas 中绘制圆角多边形?

    我正在尝试使用创建一个圆角三角形Canvas在 Jetpack Compose 中 我尝试用这段代码来绘制三角形 Composable fun RoundedTriangle Canvas modifier Modifier size 50
  • Python 看门狗重复事件

    我创建了一个修改后的看门狗示例 以便监视已添加到 Windows 中特定目录的 jpg 照片文件 import time from watchdog observers import Observer from watchdog event
  • 如何从 Windows 设置环境变量

    在 windows xp 7 8 vista 10 等中添加环境变量的方法是什么 在 Windows 7 8 Vista 或 XP 中 在桌面或开始菜单中找到 我的电脑 图标 右键单击它 然后从菜单中选择 属性 项 当您看到属性对话框时 单
  • 在 Rails 中渲染 JSON 时包含关联模型

    现在我有这一行 render json programs except gt created at updated at 但是 由于程序属于公司 我想显示公司名称而不是公司 ID 渲染节目时如何包含公司名称 像这样的东西应该有效 rende
  • 如何通过 git pre-receive hook 验证用户身份

    我想写一个pre receivePython 中的 githook 据我了解 没有任何参数被传入pre receive脚本 而不是每个引用都是使用标准输入在单独的行上传递的 我已经能够通过以下方式阅读参考更改 usr bin env pyt
  • 如何创建具有静态返回类型的扩展方法?

    我试图编写一个简单的扩展方法Color返回该颜色的黑色和白色等效值的静态类 问题是扩展方法无法返回Static类型 那么 我该怎么做呢 请帮我 问题是没有方法可以返回静态类型 静态类是无状态的 或仅具有静态状态 因此只有一个 实例 可以从引
  • 对数据库中的所有表启用更改跟踪

    假设在 SQL Server 数据库上启用了更改跟踪 如何在数据库中的所有表上启用更改跟踪 您可以使用以下 T SQL 脚本生成另一个 T SQL 脚本 该脚本启用CHANGE TRACKING所有具有主键的表的功能 Step 1 Exec
  • 如何区分 jQuery 选择器字符串和其他字符串

    我想检查字符串的 类型 特别是 如何区分 jQuery 选择器字符串和其他字符串 也就是说 下面的代码中selectorTest应该如何实现呢 var stringType function value var htmlExpr lt lt
  • C++:#pragma comment(lib, "XXX") 实际上对“XXX”做什么?

    我的背景是 C 但我必须保留一些遗留的 MS C 在那个代码库中我偶然发现 pragma comment lib OtherLib700 lib 其中 700 是一些版本控制 除此之外 该库还有一个同名的 DLL 我首先认为该程序将依赖于
  • 如何从 OHLC 数据计算枢轴值

    我有一个带有 open high low close 和 key 列的 pandas 数据集 现在我想按键对数据集进行分组 并使用公式 最高价 最低价 收盘价 3 计算枢轴 到目前为止我可以做到 但要求是将计算的数据转移到下一组 我无法编码
  • pthread 中的信号处理

    我创建了一个 pthread 并在其中安装了一个信号处理程序 与我们在中所做的方式相同main 功能 线程的信号处理程序是一个单独的函数 令人惊讶的是 它不起作用 即线程的信号处理程序无法捕获信号 这是代码 include