将局部变量传递给信号处理函数

问题描述

我想将一些数据的副本发送到信号处理程序函数,以简化的示例为例:

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)的共享内存)就更加有意义了。等

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...