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