【发布时间】:2019-03-28 04:33:11
【问题描述】:
在弄清楚signal函数的签名后,我修改了https://en.cppreference.com/w/c/program/signal给出的例子。
但是为什么我不能调用signal返回的函数(信号处理程序),而可以直接调用它呢?
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),我不明白为什么后者可以但不是前者,我认为这两个调用函数语句之间不应该有“技巧”。
【问题讨论】:
-
前面的信号处理程序不一定是指向函数的指针。
-
@user3386109 嗯,不明白。
signal返回void (*)(int),这不是指向函数的指针(函数指针)并且可以调用吗? -
回应编辑:
f1不指向signal_handler。它指向 previous 信号处理程序。您可以使用printf和%p格式说明符来显示f1和signal_handler,您会发现它们是不同的。 -
@user3386109 是的,你是对的。感谢您告诉我使用
%p:D.