首页 > 解决方案 > 将局部变量传递给信号处理函数

问题描述

我想将一些数据的副本发送到信号处理函数,举个简化的例子:

signal(SIGUSR1, handler);
void handler(int sig){
    
    //...
    _exit(some_variable);
}

目标是停止进程并使其some_variable向父级返回值而不使其成为全局变量。注意some_variable捕捉信号的项目本地,而不是发出信号的过程。

我希望能够在另一个进程(kill)(而不是父 btw)中发出信号,并且能够从控制台(kill)或使用脚本来完成它,这是使用的主要原因signal(),因为这对双方都有好处。

我知道还有其他方法可以做到这一点,但真的很想知道这是否可以使用signal()或相关方法来完成。

网站上的其他线程建议不能这样做,但它们已经很老了,也许存在一些更新的解决方案。

标签: clinuxsignalskill

解决方案


如果信号是从同一个进程发送的,只需使用全局变量即可。在这里反对使用全局变量没有依据/理由,因为信号处置已经是全局变量。也就是说,通过承诺为它安装一个处理程序SIGUSR1并为其选择一个目的,你已经选择了在这里有一个单例;添加一个变量作为该单例的一部分不再是罪过。但是在这种情况下(相同的过程),可能没有理由使用信号处理程序。在程序的各个部分之间进行通信有各种危险得多的方式。

union sigval如果信号是从不同的进程发送的,您可以通过排队传递少量数据(一个整数)sigqueue,但这仅适用于sigqueue; 如果您只想使用该kill命令,则它不起作用。一旦你选择需要一个特殊的工具来进行交互,那么丢弃信号并使用一些更好的 IPC 机制(如 unix 套接字、命名管道、共享内存以及其中的一些同步原语(信号量或互斥量+condvar))会更有意义, ETC。


推荐阅读