函数名作为参数传递
假如不知道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 函数。

浙公网安备 33010602011771号