POSIX信号
POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。
信号(signal)就是通知某个进程发生了某个事件,有时也称为软件中断(software interrupt)。信号通常是异步发生的,也就是说进程预先不知道信号准确发生的时刻。
信号可以由一个进程发送给另一个进程(或自身)或由内核发给某个进程。
kill -l 可查看系统的信号。
SIGHUP Hang-up. (1)
SIGINT Interrupt. (2)
SIGQUIT Quit. (3)
SIGILL Invalid instruction (not reset when caught). (4)
SIGTRAP Trace trap (not reset when caught). (5)
SIGIOT End process (see the abort subroutine). (6)
SIGEMT EMT instruction. (7)
SIGFPE Arithmetic exception, integer divide by 0, or floating-point exception.(8)
SIGKILL Kill (cannot be caught or ignored). (9)
SIGBUS Specification exception. (10)
SIGSEGV Segmentation violation. (11)
SIGSYS Parameter not valid to subroutine. (12)
SIGPIPE Write on a pipe when there is no process to read it. (13)
SIGALRM Alarm clock. (14)
SIGTERM Software termination signal. (15)
SIGURG Urgent condition on I/O channel. (16)
SIGSTOP Stop (cannot be caught or ignored). (17)
SIGTSTP Interactive stop. (18)
SIGCONT Continue if stopped. (19)
SIGCHLD To parent on child stop or exit. (20)
SIGTTIN Background read attempted from control terminal. (21)
SIGTTOU Background write attempted from control terminal. (22)
SIGIO Input/output possible or completed. (23)
SIGXCPU CPU time limit exceeded (see the setrlimit subroutine). (24)
SIGXFSZ File size limit exceeded (see the setrlimit subroutine).(25)
SIGMSG Input data has been stored into the input ring buffer. (27)
SIGWINCH Window size change. (28)
SIGPWR Power-fail restart. (29)
SIGUSR1 User-defined signal 1. (30)
SIGUSR2 User-defined signal 2. (31)
SIGPROF Profiling timer expired. (see the setitimer subroutine).(32)
SIGDANGER Paging space low. (33)
SIGVTALRM Virtual time alarm (see the setitimer subroutine). (34)
SIGMIGRATE Migrate process. (35)
SIGPRE Programming exception (user defined). (36)
SIGGRANT Monitor access wanted. (60)
SIGRETRACT Monitor access should be relinquished. (61)
SIGSOUND A sound control has completed execution. (62)
SIGSAK Secure attention key. (63)
每个信号都有一个与之关联的处置(disposition),也称为行为(action)。我们通过sigaction函数来设定一个信号的处置,并有三种选择。
1. 我们提供一个函数,他将在特定信号发生的任何时刻被调用。
2. 我们可以发某个信号设置为SIG_IGN来忽略(ignore)它。SIGKILL和SIGSTOP这两个信号不能被忽略。
3. 我们可以把某个信号的处置设定为SIG_DFL来启用他的缺省(default)处理。(缺省处置通常是在收到信号后终止进程,有些信号可能会产生一个core image, 内存影像)
#include <signal.h>
signal(参数1,参数2);
参数1:处理的信号。系统的信号一般为宏定义。
参数2:处理的方式(是系统默认还是忽略还是捕获)。
例如signal(SIGINT ,SIG_ING);
SIG_ING 代表忽略SIGINT信号,SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE 。发送给所有ForeGround Group的进程。
按CTRL +\组合键时,是产生了SIGQUIT信号。
例如signal(SIGINT ,SIG_DFL);
SIG_DFL代表执行系统默认操作,其实对于大多数信号的系统默认动作时终止该进程。此函数可有可无。
sigfunc* signal( int signal, sigfunc *func )
{
struct sigaction act, oact;
act.sa_handler = func;
sigemptyset( &act.sa_mask );
act.sa_flags = ;
if (signo == SIGALRM) {
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
#endif
}else{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART; /* SVR4, 4.4BSD */
#endif
}
if (sigaction(signo, &act, &oact) < ) {
return (SIG_ERR);
}
return (oac.sa_handler);
}
POSIX允许我们指定这样一组信号,他们在信号处理函数被调用时阻塞(这里的阻塞是指阻塞某个信号或某个信号集,防止它们在阻塞期间递交;不同于系统调用的阻塞),任何阻塞的信号都不能递交给进程。我们把sa_mask成员设置为空集,意味着在该信号处理函数运行期间,不阻塞额外的信号。POSIX保证被捕获的信号在其信号处理函数运行期间总是阻塞的(其他的信号不能递交给进程)。
SA_RESTART标志是可选的。如果设置,由相应信号中断的系统调用将有内核自动重启。如果被捕获的信号不是SIGALRM且SA_RESTART有定义,我们就设置该标志,一些较早期的系统(如SunOS 4.x)缺省设置成自动重启被中断的系统调用,并定义了与SA_RESTART互补的SA_INTERRUPT标志,如果定义了该标志,我们就在被捕获的信号是SIGALRM时设置它。假设一个进程正在进行accept系统调用,此时收到一个信号,如果在4.4BSD下,则内核会自动重启被中断的系统调用,accept不会返回错误;如果是在Solaris9下, 由于SA_RESTART标志并没有设置,那么accept会返回一个EINTR错误(被中断的系统调用)。
最后调用sigaction函数,并将相应信号旧的行为作为signal的返回值。
POSIX信号语义:
1. 一旦安装了信号处理函数,它便一直安装着(较早期的系统是每执行一次就将其拆除)。
2. 在一个信号处理函数运行期间,正被递交的信号是阻塞的。
3. 如果一个信号在被阻塞期间产生了一次或多次,那么该信号被解阻塞之后通常只递交一次,也就是说Unix信号缺省是不排队的。
4. 利用sigprocmask函数选择性地阻塞或解阻塞一组信号是可能的。这使得我们可以做到在一段临界区代码执行期间,防止捕获某些信号,以此保护这段代码。
POSIX信号的更多相关文章
- POSIX信号和自定义signal函数
一.信号的概念 信号(signal)就是告知某个进程发生了某个事件的通知:信号通常是异步发生的,也就是说接受信号的进程不知道信号的准确 发生时刻:信号可以(1)由一个进程发给另一个进程:(2)由内核发 ...
- Posix 信号
转载请注明来源:https://www.cnblogs.com/hookjc/ 函数sem_open创建一个新的有名信号灯或打开一个已存在的有名信号灯.有名信号灯总是既可用于线程间的同步,又可以用于进 ...
- <转>Linux环境进程间通信(二): 信号(下)
原文地址为:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html 原文为: 一.信号生命周期 从信号发送到信号处理函数的 ...
- Linux环境进程间通信(二):信号(下)
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- UNIX网络编程——信号驱动式I/O
信号驱动式I/O是指进程预先告知内核,使得当某个描述符上发生某事时,内核使用信号通知相关进程. 针对一个套接字使用信号驱动式I/O,要求进程执行以下3个步骤: 建立SIGIO信号的信号处理函数. 设置 ...
- UNIX环境高级编程——信号
一.信号生命周期 从信号发送到信号处理函数的执行完毕. 对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生:信号在进 ...
- Linux环境进程间通信(二): 信号--转载
http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html http://www.ibm.com/developerworks ...
- 使用信号进行同步 sem_post
使用信号进行同步 信号是 E. W. Dijkstra 在二十世纪六十年代末设计的一种编程架构.Dijkstra 的模型与铁路操作有关:假设某段铁路是单线的,因此一次只允许一列火车通过. 信号将用于同 ...
- Linux进程间通信—信号
三.信号(Signal) 信号是Unix系统中使用的最古老的进程间通信的方法之一.操作系统通过信号来通知某一进程发生了某一种预定好的事件:接收到信号的进程可以选择不同的方式处理该信号,一是可以采用默认 ...
随机推荐
- MVC_表单和HTML辅助方法
表单的使用 action特性告知Web浏览器信息发往哪里. method特性告知浏览器使用HTTP POST 还是 HTTP GET. GET请求用于读操作, POST请求用于写操作 HTML辅助方法 ...
- NET基础(2):类型转换
CLR最重要的特性之一就是类型安全的.在运行时,CLR总是知道对象的类型是什么.调用GetType()方法可以知道对象的确切类型,由于它是非虚方法,所以一个类型不可能伪装成另一种类型.每种编程语言都规 ...
- sp_executesql
execute相信大家都用的用熟了,简写为exec,除了用来执行存储过程,一般都用来执行动态Sql sp_executesql,sql2005中引入的新的系统存储过程,也是用来处理动态sql的, 如 ...
- MongoDb 聚合报错
聚合框架它是数据聚合的一个新框架,其概念类似于数据处理的管道. 每个文档通过一个由多个节点组成的管道,每个节点有自己特殊的功能(分组.过滤等),文档经过管道处理后,最后输出相应的结果. 管道基本的功能 ...
- (九)串行口方式0 拓展并行输出端口 02 74LS164芯片
1.先讲解74LS164 移位芯片: 74HC164.74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出. 数据通过两个输入端(DSA 或 DSB)之一串行输入:任一输入端可 ...
- SQL语句中:UNION与UNION ALL的区别
有些人看到题目,瞬间觉得楼主也太弱了吧,这种问题也要拿出来写,这种问题 随便会点sql 的人基本都会 Union 是会删除冗余数据 Union ALL 不会删除冗余数据 将所有的结果都展现给用户 ...
- [已解决] 日常开发中禁用Tomcat自动重启
最近做了一些Java Web开发,发现每次修改完java或者其他文件后tomcat都会重新加载一次项目,很耽误事,如何禁用Tomcat自动重启呢, 找到server.xml中的这一行,把其中的 rel ...
- _vimrc默认配置
"不使用兼容vi的模式set nocompatible source $VIMRUNTIME/vimrc_example.vimsource $VIMRUNTIME/mswin.vimbeh ...
- android录像增加时间记录(源码里修改)
需要做一个功能,录像和播放时都显示录时的时间,参考文章链接找不到了,不好意思,这里记录一下,防止下次找不到了.另一篇关于源码录像的流程请参考 http://www.verydemo.com/demo_ ...
- PHP计算时间差,并返回什么时间之前发表的内容
<?php header("Content-type: text/html; charset=utf-8"); function time2Units ($time){ $y ...