信号的捕捉

1、如何实现信号的捕捉

   wKioL1eF-y_QX9riAAIHQEL41zk594.png

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;
}

wKioL1eGa-vDwsDKAAAaeH1jyok128.png

wKioL1eGa-zCZu6TAAAW6bVNCIg979.png

由此看出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;
}

wKiom1eGbiniipfBAAAk2Kwvgpc635.png

wKioL1eGbiqh1JkgAAAW632LUJw517.png

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就是什么都不干,只是捕捉该信号处理函数(自定义信号处理函数),但是捕捉后什么都不做


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章