信号是软件层次上对中断机制的模拟,异步通信。
可以直接进行用户空间进程和内核进程之间的通信,内核通过信号通知用户发生的系统事件。
用户进程队信号的响应方式:
- 忽略:(除了SIGKILL,SIGSTOP)
- 捕捉信号:定义差信号处理函数,当信号发生时,执行相关处理函数;
- 执行默认操作;
信号发送:
1. kill和raise
int kill(pid_t pid, int sig); //向指定进程发送信号
pid: 指定要来接收信号的进程号;
sig: 信号(可以通过kill -l 来查看可用的信号列表);
return: 0—Success, -1—-Error;
int raise(int sig); //向当前进程(自己)发送信号
2. alarm和pause
uint alarm(uint seconds); //设置定时器,时间到时,内核向进程发送SIGALARM信号。
return:
success —0或者如果在调用alarm前已经设置了时间,否则返回上个闹钟的剩余时间;
fail — -1;
int pause(void); //将调用它的进程挂起,直到收到信号为止
信号的处理
处理方式:
1. 使用简单的signal();
2. 使用信号集函数族;
1. 使用signal()
void( *signal(int signum, void(*handler)(int) ) ) (int);
signum:指定的信号
handler:处理函数(三种方式):
①SIG_IGN:忽略;
②SIG_DFL:按默认操作;
③自定义的函数指针,注意是函数的指针
例如:
void myfun(); //假设以定义好
...
signal(SIGQUIT,myfun);
//这样当发生SIGQUIT信号时,回调用myfun(),而不是按系统默认的处理方式:退出结束当前进程。