void ( *func )( int )是一个接受一个int型参数,不返回的函数的指针;
比如:
void F( int a ) { print( "%d", a )}
void ( *func )( int ) = F
func( 3 )// 调用F函数输出3
作为函数参数的函数指针有一个专门的名称叫做回调,你可以把任意满足回调函数参数特征标的函数地址作为参数传给signal。
在这里因为signal对于sig参数可以指定用户自定义的信号处理函数,所以你可以把你要处理的这个sig的函数地址作为参数传给signal,那么系统接收到对应sig的时候就会通过你传进去的地址调用你的这个函数。
signal,此函数相对简单一些,给定一个信号,给出信号处理函数则可,当然,函数简单,其功能也相对简单许多,简单给出个函数例子如下:
#include <signal.h>#include <stdio.h>
#include <unistd.h>
void ouch(int sig)
{
printf("I got signal %d\n", sig)
// (void) signal(SIGINT, SIG_DFL)
//(void) signal(SIGINT, ouch)
}
int main()
{
(void) signal(SIGINT, ouch)
while(1)
{
printf("hello world...\n")
sleep(1)
}
}
当然,实际运用中,需要对不同到signal设定不同的到信号处理函数,SIG_IGN忽略/SIG_DFL默认,这俩宏也可以作为信号处理函数。同时SIGSTOP/SIGKILL这俩信号无法捕获和忽略。注意,经过实验发现,signal函数也会堵塞当前正在处理的signal,但是没有办法阻塞其它signal,比如正在处理SIG_INT,再来一个SIG_INT则会堵塞,但是来SIG_QUIT则会被其中断,如果SIG_QUIT有处理,则需要等待SIG_QUIT处理完了,SIG_INT才会接着刚才处理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)