将局部变量传递给信号处理函数
Pass local variable to a signal handler function
我想将一些数据的副本发送到信号处理函数,举个简单的例子:
signal(SIGUSR1, handler);
void handler(int sig){
//...
_exit(some_variable);
}
目标是停止进程并使其成为父进程的 return some_variable
值而不使其成为全局变量。请注意,some_variable
对于捕获信号的项目而言是本地的,而不是发出信号的过程。
我希望能够在另一个进程中提高信号(kill) (not the parent btw) and to be able to do it from a console (kill) or using a script, and that's the main reason for using signal()
,因为这对两者都有好处。
我知道还有其他方法可以做到这一点,但我真的很想知道这是否可以使用 signal()
或相关方法来完成。
网站上的其他线程建议不能这样做,但它们已经很老了,也许存在一些更新的解决方案。
如果信号是从同一个进程发出的,只需使用一个全局变量。这里没有basis/justification反对使用全局变量,因为信号配置已经是全局变量。也就是说,通过承诺为 SIGUSR1
安装一个处理程序并为其选择一个用途,您已经选择了这里有一个单例;添加一个变量作为该单例的一部分不再是罪过。但是在这种情况下(相同的过程)可能没有理由无论如何都使用信号处理程序。有各种各样的 far-less-dangerous 方法可以在程序的各个部分之间进行通信。
如果信号是从不同的进程发送的,您可以通过 union sigval
与 sigqueue
排队传递少量数据(一个整数),但这仅适用于 sigqueue
;如果您只想使用 kill
命令,它就不起作用。一旦你选择需要一个特殊的工具来交互,那么丢弃信号并使用一些更好的 IPC 机制就更有意义了,比如 unix 套接字、命名管道、带有一些同步原语(信号量或互斥量+condvar)的共享内存。等
我想将一些数据的副本发送到信号处理函数,举个简单的例子:
signal(SIGUSR1, handler);
void handler(int sig){
//...
_exit(some_variable);
}
目标是停止进程并使其成为父进程的 return some_variable
值而不使其成为全局变量。请注意,some_variable
对于捕获信号的项目而言是本地的,而不是发出信号的过程。
我希望能够在另一个进程中提高信号(kill) (not the parent btw) and to be able to do it from a console (kill) or using a script, and that's the main reason for using signal()
,因为这对两者都有好处。
我知道还有其他方法可以做到这一点,但我真的很想知道这是否可以使用 signal()
或相关方法来完成。
网站上的其他线程建议不能这样做,但它们已经很老了,也许存在一些更新的解决方案。
如果信号是从同一个进程发出的,只需使用一个全局变量。这里没有basis/justification反对使用全局变量,因为信号配置已经是全局变量。也就是说,通过承诺为 SIGUSR1
安装一个处理程序并为其选择一个用途,您已经选择了这里有一个单例;添加一个变量作为该单例的一部分不再是罪过。但是在这种情况下(相同的过程)可能没有理由无论如何都使用信号处理程序。有各种各样的 far-less-dangerous 方法可以在程序的各个部分之间进行通信。
如果信号是从不同的进程发送的,您可以通过 union sigval
与 sigqueue
排队传递少量数据(一个整数),但这仅适用于 sigqueue
;如果您只想使用 kill
命令,它就不起作用。一旦你选择需要一个特殊的工具来交互,那么丢弃信号并使用一些更好的 IPC 机制就更有意义了,比如 unix 套接字、命名管道、带有一些同步原语(信号量或互斥量+condvar)的共享内存。等