个人网站开发与设计摘要,广告优化师是干嘛的,wordpress在中国很慢,定西市城乡建设局网站Linux系统编程#xff08;四#xff09;信号一、什么是信号#xff1f;1、信号的本质2、信号来源硬件来源软件来源二、常见信号1.可靠信号和不可靠信号2、不可靠信号主要有以下问题:3、可靠信号与不可靠信号注册机制三、信号处理方式四、信号处理过程五、未决信号和阻塞信号…
Linux系统编程四信号一、什么是信号1、信号的本质2、信号来源硬件来源软件来源二、常见信号1.可靠信号和不可靠信号2、不可靠信号主要有以下问题:3、可靠信号与不可靠信号注册机制三、信号处理方式四、信号处理过程五、未决信号和阻塞信号六、信号集操作函数一、什么是信号
1、信号的本质
信号在linux中又称为软中断信号用来通知进程发生了异步事件。进程收到信号必须停止直到处理完信号后再执行下一条指令。
2、信号来源
硬件来源
终端按键产生信号 如Ctrl c ,Ctrl z ,Ctrl\ 硬件异常产生信号, 如(除0操作非法访问内存段错误总线错误)
软件来源
kill命令以及进程之间可以互相通过系统调用kill发送软中断信号
二、常见信号
1.可靠信号和不可靠信号
Linux信号的编号是从1-64其中32和33空缺没有对应的信号。通过kill -l 可查看所有的信号 其中
- 1~31之间的信号叫做非实时信号, 不支持排队, 信号可能会丢失, 也叫做不可靠信号。 - 34~64之间的信号叫做实时信号, 支持排队, 信号不会丢失, 也叫做可靠信号。
2、不可靠信号主要有以下问题:
存在信号丢失的问题进程收到的信号不作排队处理相同的信号多次到来会合并为一个。
3、可靠信号与不可靠信号注册机制 可靠信号注册机制: 内核每收到一个可靠信号都会去注册这个信号在信号的未决信号链中分配sigqueue结构因此不会存在信号丢失的问题。 不可靠信号的注册机制: 而对于不可靠的信号如果内核已经注册了这个信号那么便不会再去注册对于进程来说便不会知道本次信号的发生。 三、信号处理方式
1.默认动作默认动作包括
Term终止进程Ign 忽略信号 (默认即时对该种信号忽略操作)Core终止进程生成Core文件。(查验进程死亡原因 用于gdb调试)Stop停止暂停进程Cont继续运行进程
2.忽略某个信号不做任何处理 3.捕捉信号处理
四、信号处理过程 五、未决信号和阻塞信号
信号的“未决”是一种状态是信号产生和递送之间的一种状态。信号产生未决信号集中描述改信号的位会立即变为1信号处于未决状态。当信号被处理对应位会变为0如果信号被阻塞那么信号的未决状态将保持在1信号也就无法执行。
六、信号集操作函数
#include signal.h sigset_t set; // typedef unsigned long sigset_t; int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signum); int sigdelset(sigset_t *set, int signum); int sigismember(const sigset_t *set, int signum); 函数sigemptyset初始化set所指向的信号集使其中所有信号的对应bit清零表示该信号集不包含任何有效信号。函数sigfillset初始化set所指向的信号集使其中所有信号的对应bit置位表示该信号集的有效信号包括系统支持的所有信号。注意在使用sigset_t类型的变量之前一定要调用sigemptyset或sigfillset做初始化使信号集处于确定的状态。初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。这四个函数都是成功返回0出错返回-1。sigismember是一个布尔函数用于判断一个信号集的有效信号中是否包含某种信号若包含则返回1不包含则返回0出错返回-1。
#include cstdio
#include signal.h
#include unistd.h
#include stdlib.hvoid printped(sigset_t* set)
{for (int i 0; i 32; i){if (sigismember(set, i) 1){printf(1);}else{printf(0);}}printf(\n);}int main()
{sigset_t myset,oldset,set;sigemptyset(myset);sigaddset(myset, SIGQUIT);sigprocmask(SIG_BLOCK,myset,oldset);int ret;while(1){sleep(1);ret sigpending(set);if (ret -1){perror(sigpending error:);exit(1);}printped(set);}return 0;
}