После выяснения сигнатуры функции signal
я изменил пример, приведенный в https://en.cppreference.com/w/c/program/signal.
Но почему я не могу вызвать функцию (обработчик сигнала), возвращаемуюsignal
, вместо этого я могу назвать его direclty?
void (*signal( int sig, void (*handler) (int))) (int);
Функция signal
возвращает указатель на функцию, которая является void (*)(int)
.
Возвращаемое значение
Предыдущий обработчик сигнала при успехе или SIG_ERR
при ошибке (настройка обработчика сигнала может быть отключена в некоторых реализациях).
#include <signal.h>
#include <stdio.h>
void signal_handler(int signal)
{
printf("hahahah\n");
}
int main(void)
{
void (*f1)(int);
f1 = signal(SIGINT, signal_handler);
f1(3); //Get signal SIGSEGV and failed
// signal_handler(3); //OK
raise(SIGINT);
}
Я знаю, что это может показаться бессмысленным вопросом, но дело в том, f1
указывает на signal_handler
, поэтому вызов f1(3)
подобен вызову signal_handler(3)
, я не понимаю, почему последнийвсе в порядке, но не первое, я думаю, что не должно быть никаких "уловок" между этими двумя вызовами функций.