signal函数的简单用法

239 篇文章 12 订阅
49 篇文章 4 订阅

1、函数原型理解

void (*signal(int sig,void(*func)(int)))(int);

指定使用sig指定的信号编号处理信号的方法。

signal函数的返回值是函数指针。

比如说,void * myfunc();  我们说myfunc函数的返回值类型是void*

              同样, 函数指针的形式举例:

              void (*  )(int)

            *边上的空白处可以填写变量名或者函数名,

             我们将signal函数带入空白处,就是如上的形式了。

简化一下:typedef void (*sighandler)(int);----->将 void (*) (int) 用sighandler代替;

void (*signal(int sig,void(*func)(int)))(int);------>void (*signal(int sig,sighandler handler)(int);

再简化:

void (*signal(int sig,sighandler handler)(int);----------------->sighandler signal(int sig,sighandler handler);

可以先想象signal()这个函会先执行,执行完毕后剩下的int ( * )()就是signal的返回值类型,很显然这个类型是个函数指针。

小结:困扰的地方在于,函数的返回值为函数指针,而函数指针的形式,当我们带入函数进去的时候,函数名是是在函数指针里面的,这个不同于普通的指针返回值。

handler指定程序可以处理信号的三种方式之一:

默认处理(SIG_DFL):          信号由该特定信号的默认动作处理

忽略信号(SIG_IGN):      忽略信号,即使没有意义,代码执行仍然继续。

函数处理程序:                 定义一个特定的函数来处理信号

2、函数参数说明:

第一个参数是要捕捉的信号(查看信号:kill -l,9号SIGKILL信号不能被捕捉); 
第二个参数表示我们要对信号进行的处理方式。

1)忽略信号//如:忽略Ctrl+c信号

int main()
{
    signal(2,SIG_IGN);//忽略信号
    while(1)
    {
        printf("aaaaa");
        sleep(6);
    }
    return 0;
}

2) 默认动作

int main()
{
    signal(2,SIG_DFL);//默认处理信号
    while(1)
    {
        printf("aaaaa");
        sleep(6);
    }
    return 0;
}

3)自定义处理函数//捕捉到这个信号后,按照handler处理函数进行操作

#include<signal.h>
void  handler(int signo)
{
    printf("signal:%d\n:",signo);
}
int main()
{
    signal(2,handler);
    while(1)
    {
        printf("hello world\n");
        sleep(6);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值