这是一个非常古老的问题,但我想我可以向您展示一个可以回答您问题的好技巧。无需使用 sigqueue 或其他任何东西。
我也不喜欢使用全局变量,所以我必须找到一个聪明的方法,在我的例子中,发送一个 void ptr (你可以稍后将它转换为任何适合你需要的东西)。
其实你可以这样做:
signal(SIGWHATEVER, (void (*)(int))sighandler); // Yes it works ! Even with -Wall -Wextra -Werror using gcc
然后你的 sighandler 看起来像这样:
int sighandler(const int signal, void *ptr) // Actually void can be replaced with anything you want , MAGIC !
你可能会问:那么如何获得 *ptr 呢?
方法如下:
在初始化时
signal(SIGWHATEVER, (void (*)(int))sighandler)
sighandler(FAKE_SIGNAL, your_ptr);
在您的 sighandler 函数中
:
int sighandler(const int signal, void *ptr)
{
static my_struct saved = NULL;
if (saved == NULL)
saved = ptr;
if (signal == SIGNALWHATEVER)
// DO YOUR STUFF OR FREE YOUR PTR
return (0);
}