В следующей строке:
f1 = signal(SIGINT, signal_handler);
f1
назначен предыдущий обработчик сигнала (который не является signal_handler
в коде), который может не быть указателем на функция, которую вы можете вызвать с аргументом int
.
Для достижения эффекта вам нужно определить второй обработчик сигнала и назначить его на f1
после указанной выше строки.
Примерно так:
#include
#include
void signal_handler2(int signal)
{
printf("hahahah2222\n");
}
void signal_handler(int signal)
{
printf("hahahah\n");
}
int main(void)
{
void (*f1)(int);
f1 = signal(SIGINT, signal_handler);
f1 = signal(SIGINT, signal_handler2);
f1(3); //Success
signal_handler2(3); //OK
raise(SIGINT);
}
Вывод:
hahahah
hahahah2222
hahahah2222
См. Live Демо
Статический бросок берет один аргумент, но его аргументом является выражение, и выражения могут включать оператор запятой. Запятая используется в ситуациях, где Вы хотите оценить два или больше выражения сразу для их побочных эффектов, например:
int i, j;
for (i=0, j=0; i < 10; i++,j++) {
// do stuff
}
Это несколько полезно, потому что без него Вы могли только оценить одно выражение каждый для инициализатора, условия, и продолжить части для цикла (или любое другое место, выражение ожидается). Это обычно не делает для самого четкого кода, тем не менее, и семантика нечетны. Как Вы заметили, разделенная от запятой последовательность оценивает к значению ее последнего выражения.