Это действительно старый вопрос, но я думаю, что могу показать вам хороший трюк, который бы ответил на вашу проблему.
Нет необходимости использовать sigqueue или что-то еще.
Мне также не нравится использование глобальных переменных, поэтому мне пришлось найти умный способ, в моем случае, отправить пустую 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);
В твоем оцепенении func
:
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);
}