苏嵌学习之进程通行二信号通信 (过去用新浪博客写的现在搞过来~~~)
信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式
信号可以直接进行用户空间进程(注册和注销[这个注销不是很清楚])和内核进程(内核产生)之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。
如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程
用户进程对信号的响应方式:
忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即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,你会关机哦~~~~)
#include <signal.h>
#include <sys/types.h>
int raise(int sig);
alarm()和pause()
alarm()也称为闹钟函数,它可以在进程中设置一个定时器。当定时器指定的时间到时,内核就向进程发送SIGALARM信号。
pause()函数是用于将调用进程挂起直到收到信号为止。
#include <unistd.h>
unsigned int alarm(unsigned int seconds)
如果调用此alarm()前,进程中已经设置了闹钟时间,则
返回上一个闹钟时间的剩余时间,否则返回0。
#include <unistd.h>
int pause(void);
信号的处理:
信号处理的主要方法有两种
使用简单的signal()函数
使用信号集函数组(不大会)
signal()
使用signal函数处理时,需指定要处理的信号和处理函数
使用简单、易于理解(这个函数不好理解~~~~)
所需头文件:
函数原型:
函数传入值:
函数返回值:
void (*signal(int signo, void (*handler)(int)))(int);就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数), 而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.
在写信号处理函数时对于信号处理的函数也是void sig_fun(int signo);这种类型,恰好与上面signal()函数所返回的函数指针所指向的函数是一样的.
一个简单的例子:
void my_func(int sign_no)
{
}
int main()
{
}