signal()函数详解 signal函数返回值

signal()函数详解:在 这个头文件中。signal(参数1,参数2);参数1:我们要进行处理的信号。系统的信号我们可以再终端键入kill -l查看(共64个)。其实这些信号时系统定义的宏。参数2:我们处理的方式(是系统默认还是忽略还是捕获)。一般有3中方式进行操作。
(1)eg: signal(SIGINT ,SIG_ING);//SIG_ING代表忽略SIGINT信号,SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE。发送给所有ForeGround Group的进程。下面我们写个死循环:#include#includeint main(intargc , char *argv[]){signal(SIGINT,SIG_IGN);for(;;);return0;}这时我们保存执行。按下CTRL_C程序没有反应。这就对了如果我们想结束该程序可以按下CTRL+来结束其实当我们按下CTRL+组合键时,是产生了SIGQUIT信号
(2)eg: signal(SIGINT ,SIG_DFL);//SIGINT信号代表由InterruptKey产生,通常是CTRL+C或者是DELETE。发送给所有ForeGroundGroup的进程。SIG_DFL代表执行系统默认操作,其实对于大多数信号的系统默认动作时终止该进程。这与不写此处理函数是一样的。我们将上面的程序改成:#include#includeint main(int argc , char *argv[]){//signal(SIGINT,SIG_IGN);signal(SIGINT,SIG_DFL)for(;;);return 0;}这时就可以按下CTRL +C来终止该进程了。把signal(SIGINT,SIG_DFL);这句去掉,效果是一样的。
signal()函数详解 signal函数返回值
(3) void (*signal( int sig, void (* handler)( int )))( int );int (*p)();这是一个函数指针,p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数.int(*fun())();这个式子与上面式子的区别在于用fun()代替了p,而fun()是一个函数,所以说就可以看成是fun()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数.void (*signal(intsigno, void(*handler)(int)))(int);就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数),而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.在写信号处理函数时对于信号处理的函数也是v————oid sig_fun(intsigno);这种类型,恰好与上面signal()函数所返回的函数指针所指向的函数是一样的.void ( *signal() )(int );signal是一个函数,它返回一个函数指针, 后者所指向的函数接受一个整型参数 且没有返回值, 仔细看, 是不是siganal( int signo,void (*handler)(int) )的第2个参数了,对了,其实他所返回的就是signal的第2个信号处理函数,指向信号处理函数,就可以执行函数了( signal内部时,signal把信号做为参数传递给handler信号处理函数,接着 signal函数返回指针, 并且又指向信号处理函数,就开始执行它)那么,signal函数的参数又是如何呢?signal函数接受两个参数:一个整型的信号编号,以及一个指向用户定义的信号处理函数的指针。我们此前已经定义了指向用户定义的信号处理函数的指针sfp:

void (*sfp)(int);

sfp的类型可以通过将上面的声明中的sfp去掉而得到,即void(*)(int)。此外,signal函数的返回值是一个指向调用前的用户定义信号处理函数的指针,这个指针的类型与sfp指针类型一致。因此,我们可以如下声明signal函数:

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

同样地,使用typedef可以简化上面的函数声明:

typedef void(*HANDLER)(int);
HANDLER signal(int, HANDLER);


Ok;看个例子:


此程序是对当我们按下CTRL +C键时,会执行我们定义的信号处理函数。

每当我们按下CTRL +C键时会打印该信号的number.可以看出该信号的num为2

要想退出可以按下CTRL+打印结果为最后一行。

------------------------------------------------------------------------------

Linuxkill 命令补充说明:

功能说明:删除执行中的程序或工作。

语  法:kill[-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

补充说明:kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。

参  数:

 -l<信息编号> 若不加<信息编号>选项,则-l参数会列出全部的信息名称。

 -s<信息名称或编号>  指定要送出的信息。

 [程序] [程序]可以是程序的PID或是PGID,也可以是工作编号。

一些常用的Signal如下:

SignalDescription
SIGABRT由调用abort函数产生,进程非正常退出
SIGALRM用alarm函数设置的timer超时或setitimer函数设置的intervaltimer超时
SIGBUS某种特定的硬件异常,通常由内存访问引起
SIGCANCEL由Solaris Thread Library内部使用,通常不会使用
SIGCHLD进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
SIGCONT当被stop的进程恢复运行的时候,自动发送
SIGEMT和实现相关的硬件异常
SIGFPE数学相关的异常,如被0除,浮点溢出,等等
SIGFREEZESolaris专用,Hiberate或者Suspended时候发送
SIGHUP发送给具有Terminal的ControllingProcess,当terminal被disconnect时候发送
SIGILL非法指令异常
SIGINFOBSDsignal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程
SIGINT由InterruptKey产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程
SIGIO异步IO事件
SIGIOT实现相关的硬件异常,一般对应SIGABRT
SIGKILL无法处理和忽略。中止某个进程
SIGLWP由Solaris Thread Libray内部使用
SIGPIPE在reader中止之后写Pipe的时候发送
SIGPOLL当某个事件发送给Pollable Device的时候发送
SIGPROFSetitimer指定的Profiling IntervalTimer所产生
SIGPWR和系统相关。和UPS相关。
SIGQUIT输入Quit Key的时候(CTRL+)发送给所有ForegroundGroup的进程
SIGSEGV非法内存访问
SIGSTKFLTLinux专用,数学协处理器的栈异常
SIGSTOP中止进程。无法处理和忽略。
SIGSYS非法系统调用
SIGTERM请求中止进程,kill命令缺省发送
SIGTHAWSolaris专用,从Suspend恢复时候发送
SIGTRAP实现相关的硬件异常。一般是调试异常
SIGTSTPSuspend Key,一般是Ctrl+Z。发送给所有ForegroundGroup的进程
SIGTTIN当BackgroundGroup的进程尝试读取Terminal的时候发送
SIGTTOU当Background Group的进程尝试写Terminal的时候发送
SIGURG当out-of-band data接收的时候可能发送
SIGUSR1用户自定义signal 1
SIGUSR2用户自定义signal 2
SIGVTALRMsetitimer函数设置的Virtual IntervalTimer超时的时候
SIGWAITINGSolaris Thread Library内部实现专用
SIGWINCH当Terminal的窗口大小改变的时候,发送给ForegroundGroup的所有进程
SIGXCPU当CPU时间限制超时的时候
SIGXFSZ进程超过文件大小限制
SIGXRESSolaris专用,进程超过资源限制的时候发送

  

爱华网本文地址 » http://www.aihuau.com/a/25101015/271426.html

更多阅读

如何填写政治面貌?详解 如何查看自己政治面貌

如何填写政治面貌?【详解】——简介政治面貌可不是指的人的外貌,政治面貌其实是一个人的政治身份。对于我们普通公民而言,政治身份似乎没有什么影响,但是对于当权者或者机构组织而言,政治面貌就很重要了,在对个人考察方面或者职位提升方面

不同脸型适合画眉方法,详解眉毛的画法 方脸型画眉

?特写看一下...  对于圆脸型的妹子来说,需要有一些角度的眉毛,把眉峰吊起来,让脸型看起来更有棱角一些~对于下巴比较宽或者太阳穴比较窄的妹纸,美貌的形状要大气自然,而且要适当的短一些,并且加重眉头部分不同脸型适合画眉方法,详解

100道门2013攻略100关图文详解:1 第1~10关

100道门2013攻略100关图文详解:[1]第1~10关——简介100道门2013是安卓平台一款新颖的解密益智游戏,你需要在房间中发现线索,然后把门打开进入下一个房间。每一个房间的主题都不一样,将给你带来百次不同的游戏体验!100道门2013攻略100关

CSOL咆哮怒焰M14EBR详解以及专业强化分析 csol咆哮怒焰强化

众所周知,咆哮怒焰系列是威力最大的突击步枪,其高威力以及不俗的精准度让它成为了一把点射神器。而强化系统更是让这把大威力步枪如虎添翼,咆哮怒焰可以算是最值得强化的几把枪支之一了。下面是这把枪的简略评测,以及它的强化详解。大家

研究生网上报名流程 超详解 2017研究生报名流程

研究生网上报名流程 【超详解】——简介现在开始报名的话,是针对应届的毕业生的,不过过段时间都可以报名的。流程都是一样的。研究生网上报名流程 【超详解】——方法/步骤研究生网上报名流程 【超详解】 1、首先,我们搜索,进入到中国

声明:《signal()函数详解 signal函数返回值》为网友昨迟人分享!如侵犯到您的合法权益请联系我们删除