c语言signal函数详细说明

c语言中singal函数详细解释说明

对于信号处理函数位于<sys/singal.h>中

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

这个函数的声明很是吓人,一看就难懂。下面解释用法。

一步一步解释:

int (*p)();

这是一个函数指针,p所指向的函数是一个不带任何参数,并且返回值为int的一个函数。

int(*fun())();

这个式子与上一个式子的区别在于fun()代替了P,而fun()是一个函数,所以说就可以看成是fun()这个函数执行之后,他的返回值是一个函数指针,这个函数指针(其实就是上面的P)所指向的函数是一个不带任何参数,并且返回值为int的一个函数。

所以对于void(*signal(int signo,void(*handler)(int)))(int);就可以堪称是signal(int signo,void(*handler)(int))函数,(它自己带两个参数,一个是整形,一个为函数指针的函数),而这个signal()函数的返回值也是一个函数指针,这个函数指针指向一个带一个整形参数,并返回值为void的一个函数。

而你在写信号处理函数时对于信号处理的函数也是void sig_fun(int signo);这种类型,恰好与上面

signal()函数所返回的函数指针所指向的函数是一样的。注意,void (*signal())(int);signal是一个函数,它返回一个函数指针,后者所指向的函数接受一个整形参数,且没有返回值,仔细看,是不是signal(int signo,void(*handler)(int))的第二个参数了,对了,其实他所返回的就是signal的第二个信号处理函数,指向信号处理函数,就可以执行函数了(signal内部时,signal把信号作为参数传递给handler信号处理函数,接着signal函数返回指针,并且又指向信号处理函数,就开始执行它),对于这个问题,在<C陷阱与缺陷>这本书中讲的很是清晰,可以看一看。

在signal.h头文件中有以下几个定义

#define SIG_ERR (void (*)())-1

#define SIG_DFL (void(*)()) 0

#define SIG_IGN (void(*)()) 1

系统调用signal用来设定某个信号的处理方法。该调用声明的格式如下:

void (*signal(int signum,void(*handler)(int)))(int);

在使用该调用的进程中加入以下头文件:

#include <signal.h>上述声明格式比较复杂,如果不清楚如何使用,可以通过下面这种定义类型定义的格式来使用(POSIX的定义):

typedef void(*sighandler_t)(int);

sighandler_t signal(int signum,sighandler_t handler);

但这种格式在不同的系统中有不同的类型定义,所以要使用这种格式,最好还是参考一下联机手册。在调用中,参数signum指出要设置处理方法的信号。第二个参数handler是一个处理函数,或者是

SIG_IGN:忽略参数signum所指的信号。

SIG_DFL:恢复参数signum所指信号的处理方法为默认值。

传递给信号处理历程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。下面来看一个简单的例子:

#include <signal.h>

#include <unistd.h>

#include <stdio.h>

void sigroutine(int dunno)

{

        switch(dunno){

case 1:

printf("Get a signal-SIGHUP");

break;

case 2:

printf("Get a signal - SIGINT");

break;

case 3:

printf("Get a signal - SIGQUIT");

break;

}

return ;

}

int main()

{

printf("press id is %d",getpid());

signal(SIGHUP,sigrountine);

signal(SIGINT,sigrountine);

signal(SIGQUIT,sigroutine);

while(1)

{

}

}

Get a signal - SIGINT  //按下Ctrl-c得到的结果

Get a signal -  SIGQUIT //按下ctrl-得到的结果

//按下ctrl-z将进程至于后台

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值