函数名作为参数传递
假如不知道signal的函数原型,考虑child_handler函数的参数从哪里来?
void child_handler(int sig) { if (sig == SIGINT) kill(pid_parent, SIGUSR1); } int main(void) { ...... signal(SIGINT, child_handler); ...... }
1、无参无返回值的函数名作为另一个函数的参数
#include <stdio.h> //定义handler是一个函数指针类型,无参无返回值 typedef void (*handler)(void); void output(void) { printf("Hello World!\n"); } //无参函数作为另一个函数的参数 void test_func(handler func) { func(); } int main(void) { test_func(output); return 0; }
运行结果:Hello World!
2、有参有返回值的函数名作为另一个函数的参数
#include <stdio.h> //定义handler是一个函数指针类型,有两个参数和返回值 typedef int (*handler)(int, int); int add(int a, int b) { return a+b; } //有参有返回值函数作为另一个函数的参数 int test_func(int m, int n, handler func) { return func(m, n); } int main(void) { int a, b, sum; a = 3; b = 4; sum = test_func(a, b, add); printf("sum = %d\n", sum); return 0; }
运行结果:sum = 7
对于开始的疑惑,如果只从C语言的角度理解,原理是在执行完 signal(SIGINT, child_handler); 函数后,signal函数会将第一个参数 SIGINT 传递给 child_handler 函数。