Linux信号机制
来源:互联网 发布:软件自学网cad2016 编辑:程序博客网 时间:2024/06/06 02:37
信号概念
信号是软件中断,很多比较重要的应用程序都需要处理信号,信号提供了一种处理异步事件的方法。
每个信号都有一个名字,这些名字都以三个字符SIG开头。例如,SIGABORT是要装信号,当进程调用abort函数时产生这种信号。不存在编号为0的信号。
很多条件可以产生信号:
- 当用户按某些终端键时,引发终端产生的信号。在终端按DELETE键(或者很多系统中的Ctrl+C键)通常产生终端信号(SIGINT)。这是停止一个已失去控制的程序的方法。
- 硬件异常产生信号:除数为0、无效的内存引用等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对执行一个无效内存引用的进程产生SIGSEGV信号。
- 进程调用kill(2)函数可将信号发送给另一个进程或进程组。自然,对此有所限制:接受信号进程和发送信号进程的所有者必须相同,或者发送信号进程的所有者必须是超级用户。
- 用户可用kill(1)命令将信号发送给其他进程。此命令只是kill函数的接口。常用此命令终止一个失控的后台进程。当检测到某种软件条件已经发生,并应将其通知有关进程时也产生信号。这里指的不是硬件产生的条件(如除以0),而是软件条件。例如SIGURG(在网络连接上传来带外数据是产生)、SIGPIPE(在管道的读进程已经终止后,一个进程写此管道时产生),以及SIGALRM(进程所设置的闹钟时钟超时时产生)。
可以要求内核在某个信号出现时按照下列三种方式之一进行处理:忽略此信号、捕获此信号和执行系统默认动作。
信号机制函数
信号集
- sigemptyset(): 将信号集初始化为空
- sigfillset(): 将信号集初始化为包含所有已定义的信号集
- sigaddset(): 将指定信号加入到信号集中
- sigdelset(): 将指定信号从信号集中删除
- sigismember(): 查询指定信号是否在信号集中
sigprocmask函数
需头文件
#include <signal.h>
函数原型
int sigprocmask(int how,const sigset_t *set,sigset_t *oset)
函数传入值
how(决定函数的操作方式)
SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中
SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合
SIG_SETMASK:将当前的信号集合设置为信号阻塞集合
set:指定信号集
oset:信号屏蔽字
函数返回值
成功:0
出错:-1,错误原因存于error中
sigpending函数
sigpending函数用来查询“未决”信号。其函数原型及说明如下:
sigpending(查询未决信号)
所需头文件
#include <signal.h>
函数说明
将被搁置的信号集合由参数set指针返回
函数原型
int sigpending(sigset_t *set)
函数传入值
set:要检测信号集
函数返回值
成功:0
出错:-1,错误原因存于error中
错误代码
EFAULT:参数set指针地址无法存取
EINTR:此调用被中断
sigaction
sigaction(查询和设置信号处理方式)
所需头文件
#include <signal.h>
函数说明
sigaction()会依参数signum指定的信号编号来设置该信号的处理函数
函数原型
int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact)
函数传入值
signum
可以指定SIGKILL和SIGSTOP以外的所有信号
act
参数结构sigaction定义如下
struct sigaction
{
void (*sa_handler) (int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) (void);
}
① sa_handler:此参数和signal()的参数handler相同,此参数主要用来对信号旧的安装函数signal()处理形式的支持
② sa_sigaction:新的信号安装机制,处理函数被调用的时候,不但可以得到信号编号,而且可以获悉被调用的原因以及产生问题的上下文的相关信息。
③ sa_mask:用来设置在处理该信号时暂时将sa_mask指定的信号搁置
④ sa_restorer: 此参数没有使用
⑤ sa_flags:用来设置信号处理的其他相关操作,下列的数值可用。可用OR 运算(|)组合
A_NOCLDSTOP:如果参数signum为SIGCHLD,则当子进程暂停时并不会通知父进程
SA_ONESHOT/SA_RESETHAND:当调用新的信号处理函数前,将此信号处理方式改为系统预设的方式
SA_RESTART:被信号中断的系统调用会自行重启
SA_NOMASK/SA_NODEFER:在处理此信号未结束前不理会此信号的再次到来
SA_SIGINFO:信号处理函数是带有三个参数的sa_sigaction
oldact
如果参数oldact不是NULL指针,则原来的信号处理方式会由此结构sigaction返回
函数返回值
成功:0
出错:-1,错误原因存于error中
附加说明
信号处理安装的新旧两种机制:
① 使用旧的处理机制:struct sigaction act; act.sa_handler=handler_old;
② 使用新的处理机制:struct sigaction act; act.sa_sigaction=handler_new;
并设置sa_flags的SA_SIGINFO位
错误代码
EINVAL:参数signum不合法,或是企图拦截SIGKILL/SIGSTOP信号
EFAULT:参数act,oldact指针地址无法存取
EINTR:此调用被中断
sigsuspend函数
sigsuspend函数
所需头文件
#include <signal.h>
函数说明
将被搁置的信号集合由参数set指针返回
函数原型
nt sigsuspend(const sigset_t *sigmask);
函数传入值
sigmask:要屏蔽的信号集
函数返回值
成功:没有成功返回值
出错:-1,将errno设置为EINTR
- linux信号机制
- linux信号机制signal
- Linux信号机制分析
- Linux的信号机制
- Linux信号处理机制
- linux信号机制简介
- linux 信号机制、生命
- linux信号处理机制
- linux的信号机制
- Linux信号机制概述
- Linux 信号机制分析
- Linux Signal 信号机制
- Linux 信号处理机制
- linux 信号处理机制
- Linux信号机制分析
- linux信号的机制
- LINUX 信号机制
- Linux 信号机制
- Parse HTML Safely
- Ping azure
- poj 3928 Ping pong
- ubantu14.0.4下SSH无密码登陆设置
- 数据库启动三阶段
- Linux信号机制
- maven学习--生命周期和插件
- Task and Back Stack难点及疑点记录
- [LeetCode]-Palindrome Number 判断整数回文
- Qt-界面美化
- 判断是否字符串重组 Scramble String @LeetCode
- 基于Linux的TCP网络编程
- POJ 3680 Intervals(最小费用流)
- EasyUI学习-如何使用jQuery EasyUI?