【发布时间】:2020-11-06 10:45:09
【问题描述】:
我想将一些数据的副本发送到信号处理函数,举个简化的例子:
signal(SIGUSR1, handler);
void handler(int sig){
//...
_exit(some_variable);
}
目标是停止进程并使其返回some_variable 值给父级而不使其成为全局变量。请注意,some_variable 是捕获信号的项目的本地,而不是引发信号的进程。
我希望能够在另一个进程 (kill)(不是父 btw)中发出信号,并且能够从控制台 (kill) 或使用脚本来完成,那就是使用signal() 的主要原因,因为它对两者都有好处。
我知道还有其他方法可以做到这一点,但我真的很想知道这是否可以使用signal() 或相关方法来完成。
网站上的其他线程建议不能这样做,但它们已经很老了,也许存在一些更新的解决方案。
【问题讨论】:
-
您不能安全地在信号处理程序中使用
exit(),顺便说一句,只是_exit()或_Exit()。见man7.org/linux/man-pages/man7/signal-safety.7.html -
谁会提出
SIGUSR1信号?因为如果您使用sigaction并设置了SA_SIGINFO标志,那么根据引发信号的方式,将允许将用户指定的数据传递给信号处理程序。 -
您可以使用
SA_SIGINFO和sigqueue()将信息传递给sigaction()的信号处理程序。 -
我发现了一个很好的重复 stackoverflow.com/questions/6970224/… 投票结束我自己的问题,如果这有意义的话。