signal()函数理解css 在<signal.h> 这个头文件中。html signal(参数1,参数2);异步 参数1:咱们要进行处理的信号。系统的信号咱们能够再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。函数 参数2:咱们处理的方式(是系统默认仍是忽略仍是捕获)。ui 通常有3中方式进行操做。spa (1)eg: signal(SIGINT ,SIG_ING );.net //SIG_ING 表明忽略SIGINT信号,SIGINT信号表明由InterruptKey产生,一般是CTRL +C 或者是DELETE 。发送给全部ForeGround Group的进程。指针 下面咱们写个死循环:调试
 这时咱们保存执行。htm 按下CTRL _C程序没有反应。这就对了 若是咱们想结束该程序能够按下CTRL +\来结束 其实当咱们按下CTRL +\组合键时,是产生了SIGQUIT信号 (2)eg: signal(SIGINT ,SIG_DFL ); //SIGINT信号表明由InterruptKey产生,一般是CTRL +C或者是DELETE。发送给全部ForeGroundGroup的进程。 SIG_DFL表明执行系统默认操做,其实对于大多数信号的系统默认动做时终止该进程。这与不写此处理函数是同样的。 咱们将上面的程序改为
 这时就能够按下CTRL +C 来终止该进程了。把signal(SIGINT,SIG_DFL);这句去掉,效果是同样的。 (3) 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()函数(它本身是带两个参数,一个为整型,一个为函数指针的函数),而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,而且返回值为void的一个函数. 在写信号处理函数时对于信号处理的函数也是void sig_fun(int signo);这种类型,刚好与上面signal()函数所返回的函数指针所指向的函数是同样的.void ( *signal() )( int ); signal是一个函数, 它返回一个函数指针, 后者所指向的函数接受一个整型参数 且没有返回值, 仔细看, 是否是siganal( int signo, void (*handler)(int) )的第2个参数了,对了,其实他所返回的就是signal的第2个信号处理函数,指向信号处理函数,就能够执行函数了( signal内部时, signal把信号作为参数传递给handler信号处理函数,接着 signal函数返回指针, 而且又指向信号处理函数, 就开始执行它) 那么,signal函数的参数又是如何呢?signal函数接受两个参数:一个整型的信号编号,以及一个指向用户定义的信号处理函数的指针。咱们此前已经定义了指向用户定义的信号处理函数的指针sfp:
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 +\ 打印结果为最后一行。 一些经常使用的Signal 以下: 注:下面是从百度文库中找的(*^__^*) 嘻嘻……
Signal |
Description |
SIGABRT |
由调用abort函数产生,进程非正常退出 |
SIGALRM |
用alarm函数设置的timer超时或setitimer函数设置的interval timer超时 |
SIGBUS |
某种特定的硬件异常,一般由内存访问引发 |
SIGCANCEL |
由Solaris Thread Library内部使用,一般不会使用 |
SIGCHLD |
进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省状况下该Signal会被忽略 |
SIGCONT |
当被stop的进程恢复运行的时候,自动发送 |
SIGEMT |
和实现相关的硬件异常 |
SIGFPE |
数学相关的异常,如被0除,浮点溢出,等等 |
SIGFREEZE |
Solaris专用,Hiberate或者Suspended时候发送 |
SIGHUP |
发送给具备Terminal的Controlling Process,当terminal被disconnect时候发送 |
SIGILL |
非法指令异常 |
SIGINFO |
BSD signal。由Status Key产生,一般是CTRL+T。发送给全部Foreground Group的进程 |
SIGINT |
由Interrupt Key产生,一般是CTRL+C或者DELETE。发送给全部ForeGround Group的进程 |
SIGIO |
异步IO事件 |
SIGIOT |
实现相关的硬件异常,通常对应SIGABRT |
SIGKILL |
没法处理和忽略。停止某个进程 |
SIGLWP |
由Solaris Thread Libray内部使用 |
SIGPIPE |
在reader停止以后写Pipe的时候发送 |
SIGPOLL |
当某个事件发送给Pollable Device的时候发送 |
SIGPROF |
Setitimer指定的Profiling Interval Timer所产生 |
SIGPWR |
和系统相关。和UPS相关。 |
SIGQUIT |
输入Quit Key的时候(CTRL+\)发送给全部Foreground Group的进程 |
SIGSEGV |
非法内存访问 |
SIGSTKFLT |
Linux专用,数学协处理器的栈异常 |
SIGSTOP |
停止进程。没法处理和忽略。 |
SIGSYS |
非法系统调用 |
SIGTERM |
请求停止进程,kill命令缺省发送 |
SIGTHAW |
Solaris专用,从Suspend恢复时候发送 |
SIGTRAP |
实现相关的硬件异常。通常是调试异常 |
SIGTSTP |
Suspend Key,通常是Ctrl+Z。发送给全部Foreground Group的进程 |
SIGTTIN |
当Background Group的进程尝试读取Terminal的时候发送 |
SIGTTOU |
当Background Group的进程尝试写Terminal的时候发送 |
SIGURG |
当out-of-band data接收的时候可能发送 |
SIGUSR1 |
用户自定义signal 1 |
SIGUSR2 |
用户自定义signal 2 |
SIGVTALRM |
setitimer函数设置的Virtual Interval Timer超时的时候 |
SIGWAITING |
Solaris Thread Library内部实现专用 |
SIGWINCH |
当Terminal的窗口大小改变的时候,发送给Foreground Group的全部进程 |
SIGXCPU |
当CPU时间限制超时的时候 |
SIGXFSZ |
进程超过文件大小限制 |
SIGXRES |
Solaris专用,进程超过资源限制的时候发送 |
|