码迷,mamicode.com
首页 > 其他好文 > 详细

信号的捕捉

时间:2016-07-15 06:42:35      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:信号的捕捉

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


信号的捕捉

标签:信号的捕捉

原文地址:http://frankenstein.blog.51cto.com/10918184/1826541

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!