C 将带参数的函数传递给信号处理程序?

C 将带参数的函数传递给信号处理程序?,c,posix,C,Posix,我可以成功地将函数传递给signal(),但如果不使用static或全局变量,就无法将参数传递给函数functiontimer只更新一个数组 if (signal(SIGALRM, (void (*)(int)) functionontimer) == SIG_ERR) { return(-1); } 是否有任何方法可以在不使用static或全局变量的情况下将指针与函数一起传递?我希望functiontimer的定义类似于functiontimer(int*data,index) 是否可以在

我可以成功地将函数传递给signal(),但如果不使用
static
或全局变量,就无法将参数传递给函数
functiontimer
只更新一个数组

if (signal(SIGALRM, (void (*)(int)) functionontimer) == SIG_ERR) 
{
return(-1);
}
是否有任何方法可以在不使用
static
或全局变量的情况下将指针与函数一起传递?我希望functiontimer的定义类似于
functiontimer(int*data,index)

是否可以在不使用
static
或全局变量的情况下将指针与函数一起传递?我希望functiontimer的定义类似于
functiontimer(int*data,index)

不,没有,如果您强制输入一个需要额外参数的函数,如您在示例中所示,则当系统使用预期使用的参数的数量和类型而不是函数实际定义要接收的参数的数量和类型来调用它时,会发生未定义的行为


目前还不清楚您想要建议的行为的目的是什么,但很可能是信号处理无法达到该目的。它当然不能达到您所希望的目的。

SA_SIGINFO
一起使用。@Myst,
sigaction()
在这里没有帮助。是的,它允许使用具有不同(特定)签名的信号处理程序,但它不支持OP将用户数据传递给处理程序的目标。@JohnBollinger,这是真的,也许IO信号除外。这就是为什么我把它写在评论里而不是答案里<代码>信号应该被认为是不推荐的。@Myst,关于I/O信号,我没有听你的
sigaction()
允许您在信号处理程序函数的两个签名之间进行选择。在任何一种情况下,参数都传递有关信号的信息,而不是程序选择的任意数据。至于被认为不推荐使用的
signal()
,如果您只需要支持符合POSIX标准的环境,那么您可能有这种自由,但是C本身只定义了
signal()
,而不是
sigaction()
@JohnBollinger,感谢您指出这一点。我倾向于忽略非POSIX环境而导致自己的死亡。今天我了解到,使用
信号
可能是最符合要求的选择。至于IO信号,我引用了
asio
作为可能的例外,这显然是另一个野兽,与
sigaction
无关。我明白了,我相信这一点。我遇到的基本问题是Linux和不改变程序的基本架构。我试图将使用kevent的代码移植到Linux,然后将grandcentraldispatch移植到Linux,但在Linux的未来版本之间保持树兼容性。我认为答案应该是POSIX,但Linux包含POSIX扩展,BSD没有。我只需要一个每100毫秒运行一次的函数,它可以接受一个参数,这比我预期的更具挑战性。@bdegnan,会有帮助吗?@bdegnan,我发现将“计时器”移动到用户空间是最有效的方法(这就是我所做的,从
kqueue
/
epoll
切换相当容易)。。。这是假设你有一个事件循环在某处运行。@JohnBollinger这是一个支持所有需要的东西的奇怪的三要素。GCD相当不错,BSD从kevent搬走了。我可以使用pthreads和sleep。这真的只是我觉得有人有一个很好的方法来处理这件事,这是不容易在谷歌上找到。这意味着这样做是错误的(正如你所描述的)。我只是想看看是否有人对此有所顿悟。我还将介绍Myst的方法。