1、如何实现信号的捕捉
2、sigaction函数
include<signal.h>
int sigaction(int signo, const struct sigaction *act, struct sigaction *oact)
sigaction函数可以读取和修改与指定信号相关联的处理动作。调用成功返回0,出错返回-1.
signo是指定信号的编号;若act指针非空,则通过act修改该信号的处理动作;若oact指针非空,则通过oact传出该信号原来的处理动作。
3、pause函数
include<unistd.h>
int pause(void)
pause函数使调用进程挂起直到有信号递达,若信号处理动作是默认动作,则终止进程, pause函数不返回;若处理动作是忽略,则进程继续处于挂起状态,pause函数不返回;若处理动作是捕捉,则调用信号处理函数之后,pause返回-1,errno设置为EINTR(被信号中断), 所以pause只有出错才返回。
4、volatile限定符
#include<stdio.h>
volatile int flag=0;
void handler(int sig)
{
printf("get a sig, %d\n",sig);
flag=1;
}
int main()
{
signal(2,handler);
while(!flag);
return 0;
}
由此看出volatile限定符是防止编译器对变量的优化,上述例子把flag改为1,进入while循环才退出
但是要是对上述代码优化,结果就会变成死循环:
#include<stdio.h>
int flag=0;
void handler(int sig)
{
printf("get a sig, %d\n",sig);
flag=1;
}
int main()
{
signal(2,handler);
while(!flag);
return 0;
}
5、my_sleep
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void handler(int sig)
{
}
unsigned int my_sleep(unsigned int _timeout)
{
struct sigaction act, oact;
act.sa_handler=handler;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
sigaction(SIGALRM,&act,&oact);
alarm(_timeout);
pause();
unsigned int remain=alarm(0);
}
int main()
{
while(1){
my_sleep(1);
printf("I use my sleep...\n");
}
}
sleep就是什么都不干,只是捕捉该信号处理函数(自定义信号处理函数),但是捕捉后什么都不做