假如不知道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 函数。