msgrcv - SA_RESTART 标志不起作用

2024-03-25

我的使用 IPC 队列在线程之间通信的代码有问题。 我需要安全地处理 SIGINT - 让程序在关闭之前出现 SIGINT 时完成所有活动线程。不过,我在寻找解决方案方面遇到了严重的问题,因为即使使用带有标志 SA_RESTART 的 SIGINT sigaction,msgrcv 函数也会出现 EINTR 错误。

我的问题是 - 除了 msgrcv 函数之外,还有什么方法可以避免 EINTR 在某些“if”中指定错误条件,例如:

if (msgrcv<0){
  if (errno == EINTR){
    errno = 0;
  }
}

这是我的程序的真正简化版本,用于演示问题:

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/msg.h>

#define IPC_KEY 11000
#define BUF_SIZE 128

//structure of IPC message
typedef struct msgbuf{
  long mtype;
  char mtext[BUF_SIZE];
} message_buf;


void handle_sigint(int sig){
  signal(SIGINT,SIG_IGN);
  /*
    some operation to handle sigint,
    here it's really simple setting 
    SIGINT to be ignored
  */ 

}

int main(){

  long ipc_id;
  message_buf msg;
  struct sigaction setup_action;
  sigset_t block_mask;

  //setup sigaction for SIGINT
  sigemptyset(&block_mask);
  sigaddset(&block_mask,SIGINT);
  setup_action.sa_handler = handle_sigint;
  setup_action.sa_mask = block_mask;
  setup_action.sa_flags = SA_RESTART;
  if (sigaction(SIGINT, &setup_action, 0) < 0){
    perror("sigaction");
    exit(1);
  }

  //creating the ipc queue
  if ((ipc_id = msgget(IPC_KEY, IPC_CREAT | IPC_EXCL | 0666))<0){
    perror("error in msgget");
    exit(1);
  }

  for(;;){
    if (msgrcv(ipc_id,&msg,BUF_SIZE,1,0)<0){
      perror("error in msgrcv");
      exit(1);
    }
    printf("received message : %s\n",msg.mtext);
  }

}

这是清理 IPC 队列的简单程序:

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/msg.h>

#define IPC_KEY 11000


int main(){

  long ipc_id;

  if ((ipc_id = msgget(IPC_KEY, IPC_CREAT | 0666 )) < 0) {
    perror("error in msgget");
    exit(1);
  }

  if (msgctl(ipc_id, IPC_RMID, 0) != 0){
    perror("error in msgctl");
    exit(1);        
  }


  return 0;

}

预先感谢您的帮助!我真的希望我没有提出重复的问题,但我尝试寻找一段时间的解决方案,不幸的是除了使用 if 函数显式捕获 EINTR errno 之外没有找到任何其他解决方案。


来自(Linux) 手册 http://man7.org/linux/man-pages/man7/signal.7.html:

以下接口中断后永不重启 由信号处理程序处理,无论是否使用 SA_RESTART;他们总是 被信号中断时失败并出现错误 EINTR 处理程序:

....

  • 系统V IPC接口:msgrcv(2)、msgsnd(2)、semop(2) 和 semtimedop(2)。

The way SA_RESTART处理的是定义的位实现。您没有标记特定的 Unix 风格,但我认为您的 Unix 根本不服从SA_RESTART对于您的特定系统调用。

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

msgrcv - SA_RESTART 标志不起作用 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • Postgres 中的按位运算

    我有以下表格 types id name 1 A 2 B 4 C 8 D 16 E 32 F and vendors id name type 1 Alex 2 type B only 2 Bob 5 A C 3 Cheryl 32 F 4
  • 高效的 numpy 数组创建

    Given x 我想生产x log x 作为一个 numpy 数组 其中x有形状s 结果有形状 s 2 做到这一点的最巧妙的方法是什么 x可能只是一个浮点数 在这种情况下我想要一个具有形状的结果 2 一个丑陋的方法是 import nump
  • 将关闭按钮(红色 x)添加到 .NET 工具提示

    我正在寻找一种向 NET ToolTip 对象添加关闭按钮的方法 类似于 NotifyIcon 所具有的按钮 我使用工具提示作为消息气球 通过 Show 方法以编程方式调用 这工作正常 但没有 onclick 事件或关闭工具提示的简单方法
  • UILabel 文本末尾的 UIImage

    如果 UILabel 中有超过 1 行文本 如何找到 UILabel 中最后一个字符的坐标 我想在文本末尾添加图像 我想你正在寻找NSTextAttachment create an NSMutableAttributedString le
  • Babel.js 使用导入和导出不起作用

    我正在尝试使用导入和导出来创建模块 但它不起作用 I added https cdnjs cloudflare com ajax libs babel standalone 6 24 0 babel min js https cdnjs c
  • NPOI 不会更改单元格的字体颜色

    我正在尝试有条件地更改单元格的字体颜色 这是我最后一次尝试 IWorkbook wb null using FileStream fileStream new FileStream path FileMode Open FileAccess
  • mongodb聚合框架-从函数生成_id

    是否可以在 group 的 id 字段中拥有自定义函数 尽管文档似乎表明可以计算该字段 但我无法使其工作 例如 假设我有一组文档 其中的数字字段范围为 1 到 100 我想将数字分类到多个桶中 例如1 20 21 40 等 然后 我将使用此
  • 使用 Go 进行 IAM 身份验证的 API 网关 HTTP 客户端请求

    您好 StackOverflow AWS Gophers 我正在实施 https github com umccr cliCLI 具有出色的spf13 的 cobra viper 软件包 https github com spf13 cob
  • C# 检查字符串是否包含字符串数组中的任何匹配项

    在 C 中检查字符串是否包含字符串数组中的任何匹配项的最快方法是什么 我可以使用循环来做到这一点 但我认为这太慢了 使用 LINQ return array Any s gt s Equals myString 当然 您可能需要考虑文化和案
  • java - 无法从 DocumentListener 方法内部更改 JTextfield 的值

    我收到 尝试在通知中进行变异 异常 1 我怎样才能改变它 2 如何获取触发监听器之前 TextField 内的值 EDIT 是这样的 在 JTextfield 上我有这个监听器 basePriceTF getDocument addDocu
  • 使用 Windows 身份验证和特定帐户连接到 SQL Server

    我有一个 ASP Net 应用程序 它使用 Windows 身份验证运行 与 SQL Server 的连接通常是通过创建 SQL Server 帐户并在连接字符串中使用该帐户来完成的 然而 在这个特定的非常严格的托管环境中 我们被要求使用特
  • “警告:react-modal:应用程序元素未定义。请使用`Modal.setAppElement(el)`或设置`appElement={el}`”

    如何使用react modal包在React应用程序的控制台中修复此警 告 警告 react modal 应用程序元素未定义 请用Modal setAppElement el or set appElement el 我还没有成功地弄清楚什
  • SwiftUI @FocusState - 如何赋予它初始值

    我很高兴看到 TextField 增强功能 focused https developer apple com documentation swiftui view focused https developer apple com doc
  • 用于构建面向对象软件的好资源或书籍[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • mariadb声明变量语法错误

    我使用 mariadb 和 heidisql 来执行 sql 声明 AccountID INT 插入帐户 名字 mi 姓氏 电子邮件 is admin is enabled date created 值 testfirstname a te
  • htaccess 强制 https 并将 www 重定向到非 www,但没有其他子域

    我知道有很多类似的线程 但似乎没有一个与我的确切问题相符 这是我正在尝试做的事情 1 http www mydomain com gt https mydomain com 2 http mydomain com gt https mydo
  • PHP 友好 URL 路由帮助

    我正在构建一个通过index php 运行所有代码的网站 例如index php controller something id 01234 我想使用 PHP 创建友好的 URL 所以我这样做 request str replace roo
  • SQL Server 通配符[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions Does Select from t
  • Python:检测黑色方块

    我正在尝试检测黑色方块 到目前为止 这是我的代码 frame cv2 imread squares jpg img cv2 GaussianBlur frame 5 5 0 img cv2 cvtColor frame cv2 COLOR
  • msgrcv - SA_RESTART 标志不起作用

    我的使用 IPC 队列在线程之间通信的代码有问题 我需要安全地处理 SIGINT 让程序在关闭之前出现 SIGINT 时完成所有活动线程 不过 我在寻找解决方案方面遇到了严重的问题 因为即使使用带有标志 SA RESTART 的 SIGIN