信号的捕捉

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

时间: 2024-11-06 14:06:45

信号的捕捉的相关文章

shell脚本进阶之信号的捕捉

shell脚本之信号的捕捉 ? trap,翻译过来就是陷阱的意思,shell脚本中的陷阱是专门用来捕捉信号的.啥信号呢?比如经常使用的kill -9,kill -15,CTRL+C等都属于信号 1.查看所有可用的信号 trap -l或kill -l即可 [[email protected] ~]# kill -l 63) SIGRTMAX-1 64) SIGRTMAX [[email protected] ~]# trap -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4)

父子进程捕捉信号的特点

经过实验:除了2个无法捕捉的信号 只要父进程没有定义该信号,捕捉到信号后,父子都按默认方式处理 父进程定义了,子进程没定义,则父进程按照定义的方式处理,子进程按照默认方式处理: 父子进程都定义,捕捉到后按各自的方式处理.

2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,

 1信号产生原因 2.进程处理信号行为 manpage里信号3中处理方式: SIG_IGN SIG_DFL                                            默认Term动作 a signal handling function 进程处理信号 A默认处理动作 term   中断 core    core(调试的时候产生) gcc –g file.c ulimit –c 1024 gdb a.out core ign      忽略 stop     停止

内核实现信号捕捉原理

信号捕捉特性 进程正常运行时,默认PCB中有一个信号屏蔽字,假定为☆,它决定了进程自动屏蔽哪些信号.当注册了某个信号捕捉函数,捕捉到该信号以后,要调用该函数.而该函数有可能执行很长时间,在这期间所屏蔽的信号不由☆来指定.而是用sa_mask来指定.调用完信号处理函数,再恢复为☆. XXX信号捕捉函数执行期间,XXX信号自动被屏蔽. 阻塞的常规信号不支持排队,产生多次只记录一次.(后32个实时信号支持排队) 练习1:为某个信号设置捕捉函数                              

Linux 信号signal处理机制(ZZ)

http://www.cnblogs.com/taobataoma/archive/2007/08/30/875743.html 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分. 一.信号的基本概念 本节先介绍信号的一些基本概念,然后

信号的基本概念

1.信号 信号主要用来通知进程发生了异步事件,而不会给进程传递任何数据.信号总共有62个,前32个被称为普通信号,34-64被称为实时信号.通常只关心普通信号. 2.信号的产生 1> 键盘 通过组合键发送一个信号,一定是给前台进程的.例如ctrl+c 2>用系统函数发送信号 可以给指定进程发送信号,例如kill命令用kill()函数实现,abort函数是当前进程接收到信号而异常终止.raise自己给自己发送信号. 3>由软件条件产生 alarm(时间数),当alarm完成后直接终止进程.

LINUX信号

一.产生信号的三种方式: 1.由键盘(终端按键)产生,比如在shell下启动一个前台进程(控制台下的进程),按Ctrl^C(只能发给前台进程)会产生一个硬件中断,若CPU正在执行此进程代码,则该进程用户空间代码暂停执行,CPU从用户态切换到内核态处理中断,如果不是自定义信号处理函数,一般默认的处理动作为终止进程,所以在内核态直接终止进程而不返回用户区. 2.由系统函数发送信号,可用kill命令给某个指定进程发送信号,它是调用kill函数实现的. 模型:kill -发送几号信号 给哪个进程 例:k

Linux 信号signal处理机制

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分. 一.信号的基本概念 本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件.基本概念对于理解和使用信号,对于理解信号机制都特别重要.下面就来看看什么是信号. 1.基本

[Erlang]link进程信号详解

原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 联系邮箱:[email protected] 估计很多同学都会对link时各种信号及捕捉机制有点迷糊,我这边在画一个表格,特分享给大家 Reason Trapping exits (trap_exit = true) Not trapping exits (trap_exit = false) normal Receives {'EXIT', Pid, Normal} Nothin