信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式
信号可以直接进行用户空间进程(注册和注销[这个注销不是很清楚])和内核进程(内核产生)之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。
如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程
<wbr></wbr>
用户进程对信号的响应方式:
忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。
捕捉信号:定义信号处理函数(后面说),当信号发生时,执行相应的处理函数。
执行缺省操作:Linux对每种信号都规定了默认操作 (man kill 看看,有很多)
信号发送与捕捉
:
kill()和raise()
kill –l 命令查看系统支持的信号列表
raise函数允许进程向自己发送信号
#include <signal.h>
#include <sys/types.h>
int kill(pid_t pid, int sig);(pid = -1,你会关机哦~~~~)
<wbr></wbr>
#include <signal.h>
#include <sys/types.h>
int raise(int sig);
<wbr></wbr>
alarm()和pause()
alarm()也称为闹钟函数,它可以在进程中设置一个定时器。当定时器指定的时间到时,内核就向进程发送SIGALARM信号。
pause()函数是用于将调用进程挂起直到收到信号为止。
#include <unistd.h>
unsigned int alarm(unsigned int seconds)
如果调用此alarm()前,进程中已经设置了闹钟时间,则
返回上一个闹钟时间的剩余时间,否则返回0。
<wbr></wbr>
#include <unistd.h>
int pause(void);
<wbr></wbr>
信号的处理:
信号处理的主要方法有两种
使用简单的signal()函数
使用信号集函数组(不大会)
<wbr></wbr>
signal()
使用signal函数处理时,需指定要处理的信号和处理函数
使用简单、易于理解(这个函数不好理解~~~~)
<wbr></wbr>
所需头文件: <wbr><wbr><wbr>#include <signal.h><br> 函数原型: <wbr><wbr><wbr><wbr><wbr>void (*signal(int signum, void (*handler)(int)))(int);<br> 函数传入值: <wbr><wbr><wbr>signum:指定信号<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>handler: <wbr>SIG_IGN:忽略该信号。<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>SIG_DFL:采用系统默认方式处理信号。<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>自定义的信号处理函数指针<br> 函数返回值: <wbr><wbr><wbr>成功:设置之前的信号处理方式<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>出错:-1</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
void (*signal(int signo, void (*handler)(int)))(int);就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数), 而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.
在写信号处理函数时对于信号处理的函数也是void sig_fun(int signo);这种类型,恰好与上面signal()函数所返回的函数指针所指向的函数是一样的.
一个简单的例子:
void my_func(int sign_no)
{
<wbr>if (sign_no = = SIGINT)<br><wbr><wbr>printf("I have got SIGINT\n");<br><wbr>else if (sign_no = = SIGQUIT)<br><wbr><wbr>printf("I have got SIGQUIT\n");<br>
}</wbr></wbr></wbr></wbr></wbr></wbr>
int main()
{
<wbr>printf("Waiting for signal SIGINT or SIGQUIT \n ");<br><wbr>signal(SIGINT, my_func);<br><wbr>signal(SIGQUIT, my_func);<br><wbr>pause();<br><wbr>exit(0);<br>
}<br></wbr></wbr></wbr></wbr></wbr>