c - 将局部变量传递给信号处理函数
问题描述
我想将一些数据的副本发送到信号处理函数,举个简化的例子:
signal(SIGUSR1, handler);
void handler(int sig){
//...
_exit(some_variable);
}
目标是停止进程并使其some_variable
向父级返回值而不使其成为全局变量。注意some_variable
捕捉信号的项目本地,而不是发出信号的过程。
我希望能够在另一个进程(kill)(而不是父 btw)中发出信号,并且能够从控制台(kill)或使用脚本来完成它,这是使用的主要原因signal()
,因为这对双方都有好处。
我知道还有其他方法可以做到这一点,但真的很想知道这是否可以使用signal()
或相关方法来完成。
网站上的其他线程建议不能这样做,但它们已经很老了,也许存在一些更新的解决方案。
解决方案
如果信号是从同一个进程发送的,只需使用全局变量即可。在这里反对使用全局变量没有依据/理由,因为信号处置已经是全局变量。也就是说,通过承诺为它安装一个处理程序SIGUSR1
并为其选择一个目的,你已经选择了在这里有一个单例;添加一个变量作为该单例的一部分不再是罪过。但是在这种情况下(相同的过程),可能没有理由使用信号处理程序。在程序的各个部分之间进行通信有各种危险得多的方式。
union sigval
如果信号是从不同的进程发送的,您可以通过排队传递少量数据(一个整数)sigqueue
,但这仅适用于sigqueue
; 如果您只想使用该kill
命令,则它不起作用。一旦你选择需要一个特殊的工具来进行交互,那么丢弃信号并使用一些更好的 IPC 机制(如 unix 套接字、命名管道、共享内存以及其中的一些同步原语(信号量或互斥量+condvar))会更有意义, ETC。
推荐阅读
- reactjs - 将 create-react-app 部署到 Plesk Onyx
- java - 在运行我的 Android Studio 项目时,Java 编译器给出了这个错误
- javascript - 通过 .map 问题转换对象数组
- sql - SQL Server 2008 R2:查找两列之间的链接和链
- javascript - webpack css-loader 解析失败
- c++ - c++ 基于模板字符串字面量返回的函数指针
- java - SOCKET TCP android java to java -> 客户端在 out.println(message) 上发送错误消息
- r - 计算以相同的第一位数字,然后是第二位数字等开头的数字的出现次数
- javascript - 在平行表中对齐单元格高度
- php - 需要修复 mysqli_result 代码