真扭结!linux定时器发出的信号怎样携带参数,要把一个参数传递给该信号处理函数

真纠结!linux定时器发出的信号怎样携带参数,要把一个参数传递给该信号处理函数
要在程序中每隔一段时间执行一个函数一次。要把主程序中一个结构的地址传递给该函数。signal注册的信号处理函数除了信号值本身外不能携带而外参数。sigaction注册的信号处理函数可以有3个参数,一个信号值本身,一个void指针,第3个参数POSIX标准没有定义(好像不能用)。

本来想用sigaction注册信号处理函数,这样处理函数就可以接受而外传递的参数了。可是定时器信号发出时,怎么给定额外信息参数呢?

sigqueue函数可以在发出信号时让信号携带额外的参数。可是我的信号是由定时器发出的。怎么传递参数呢?


------解决思路----------------------
引用:
木有办法吗?那我只能用全局变量这种不优雅的方式了。


全局变量不优雅???全局变量不要滥用,只在必要的时候用就是了。

sigaction不能带额外参数,是由它的特性确定的。posix也是这么规定的,这个问题不用纠结。
------解决思路----------------------

你要的只是获得外部数据的方式,
全局变量,函数,都可以,
如果觉得全局变量不优雅,就用函数封一下。
------解决思路----------------------
可以共享内存啊,消息队列啊.多了
------解决思路----------------------
不要用signal();用sigaction();
------解决思路----------------------
引用
就算都遵守了用函数访问的规则,你也不能保证不会乱调用这个函数。
所以函数访问也没什么改观。反而麻烦了一点。


用多了就会体会到封装的好处。
------解决思路----------------------
引用:
引用:可以共享内存啊,消息队列啊.多了
搞这么复杂?


这个哪里复杂嘛,消息队列10行代码内就能解决你的问题.
------解决思路----------------------
实在想加个参数, thunk贝...

------解决思路----------------------
定时器发出的信号,没有额外的参数,这个真没有办法。
在信号处理函数里去取主程序中一个结构的地址吧。
------解决思路----------------------
namespace glo{
//全局变量
}
------解决思路----------------------
只要有函数指针, 不就可以thunk么, 想传几个参数传几个, 不过就是不比全局变量好看倒是, 对细节的依赖也稍微多点, 换种CPU啥的又得重新写下, 不过准备好 x86, amd64, arm , mips , ppc , sh4 版本大部分时候就可以了, 遇到新的了再加也不费啥事情.   如果确实需要, 这就标准做法, 没啥大不了的.