问题描述
我想将一些数据的副本发送到信号处理程序函数,以简化的示例为例:
signal(SIGUSR1,handler);
void handler(int sig){
//...
_exit(some_variable);
}
目标是停止该过程,并使其返回some_variable
值给父级,而不使其成为全局变量。请注意,some_variable
对于捕获信号的项目来说是本地的,而不是发出信号的过程。
我想既可以在另一个进程(kill)中发出信号(而不是父进程),又可以从控制台(kill)或使用脚本,这是使用signal()
的主要原因,因为这对两者都有好处。
我知道还有其他方法可以执行此操作,但是我真的很想知道是否可以使用signal()
或相关方法来完成此操作。
该站点上的其他线程建议无法通过这种方式完成此操作,但是它们已经很老了,也许存在一些较新的解决方案。
解决方法
如果信号是从同一进程发送的,则只需使用全局变量。这里没有反对使用全局变量的依据/理由,因为信号处理已经是全局变量。也就是说,通过致力于为SIGUSR1
安装处理程序并为其选择目的,您已经选择在这里拥有一个单例。将变量添加为该单例的一部分不再是罪过。但是,在这种情况下(相同的过程),可能没有理由使用信号处理程序。在程序的各个部分之间进行通讯时,有各种各样的危险程度很低。
如果信号是从另一个进程发送的,则可以通过与union sigval
排队的sigqueue
传递少量数据(一个整数),但这仅适用于sigqueue
;如果您只想使用kill
命令,则无法正常工作。一旦您选择需要特殊的工具进行交互,丢弃信号并使用一些更好的IPC机制(例如unix套接字,命名管道,内部带有一些同步原语(信号量或互斥体+ condvar)的共享内存)就更加有意义了。等