linux下signal()函数详解
|
首先说明函数指针的定义形式:
<存储类型> 数据类型 (* 函数指针名) (参数表); 其中存储类型一般不写,用默认形式。可以选auto型、static型和extern型等。数据类型是指针所指向函数返回值的数据类型。参数表是指向函数的参数表。 再说明一个函数的返回值是一个函数指针(可理解为此函数A实际返回的是一个指向另一个函数B的指针)的定义形式: <存储类型> 数据类型 (* 函数名(参数表1))(参数表2); 表头文件 #include<signal.h> 功 能: 设置某一信号的对应动作 函数原型 : void (*signal(int signum,void(* handler)(int)))(int); 或者:typedef void(*sig_t) ( int ); sig_t signal(int signum,sig_t handler); 参数说明: 第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。 第二个参数handler描述了与信号关联的动作,它可以取以下三种值: (1)一个返回值为正数的函数地址 此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为sig的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义: intfunc(int sig); sig是传递给它的唯一参数。执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。 (2)SIGIGN 这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。 (3)SIGDFL 这个符号表示恢复系统对信号的默认处理。 函数说明 : signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断。 返回值: 返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。 附加说明 :在信号发生跳转到自定的handler处理函数执行后,系统会自动将此处理函数换回原来系统预设的处理方式,如果要改变此操作请改用sigaction()。 下面的情况可以产生Signal: 1. 按下CTRL+C产生SIGINT 2. 硬件中断,如除0,非法内存访问(SIGSEV)等等 3. Kill函数可以对进程发送Signal 4. Kill命令。实际上是对Kill函数的一个包装 5. 软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGPIPE),等等
(编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

