linux的基础知识——signal信号捕捉,信号集操作函数
文章目录
- 1.signal捕捉信号
- 2.信号集操作函数
- 3.sigprocmask函数
- 4.sigpending函数
- 5.例子1:打印某个进程未决信号集
- 6.例子2:signal函数的注册捕捉执行函数
- 7.sigaction函数
- 8.信号捕捉特性
- 9.内核实现信号捕捉过程
1.signal捕捉信号
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
\qquadsignal(SIGALRM,myfunc)
函数会捕捉SIGALRM
信号,捕捉之后会执行myfunc
函数,而不会终止当前进程。
#include<stdio.h>
#include<sys/time.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>void myfunc(int signo)
{printf("hello world\n");
}int main()
{struct itimerval it , oldit;signal(SIGALRM,myfunc);//注册SIGALRM信号的捕捉处理函数it.it_value.tv_sec = 5;it.it_value.tv_usec = 0;it.it_interval.tv_sec = 1;it.it_interval.tv_usec =0;if(setitimer(ITIMER_REAL,&it,&oldit)==-1){perror("setitimer error");exit(1);}while(1);return 0;
}
2.信号集操作函数
\qquad内核通过读取未决信号集来判断信号是否应该被处理。信号屏蔽字mask可以影响未决信号集,而我们可以在应用程序中自定义set来改变mask,以达到屏蔽指定信号的目的。
#include <signal.h>
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);
3.sigprocmask函数
4.sigpending函数
5.例子1:打印某个进程未决信号集
\qquad其中3号信号在进程中会发出,然后被屏蔽,打印前后的未决信号集
#include<stdio.h>
#include<signal.h>
#include<unistd.h>void printped(sigset_t *ped)
{int i;for(i=1;i<33;i++){if(sigismember(ped,i)==1){putchar('1');}else{putchar('0');}}printf("\n");
}
int main()
{sigset_t myset,oldset,ped;sigemptyset(&myset);sigaddset(&myset,SIGQUIT);sigprocmask(SIG_BLOCK,&myset,&oldset);while(1){sigpending(&ped);printped(&ped);sleep(1);}return 0;
}
6.例子2:signal函数的注册捕捉执行函数
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>typedef void (*sighandler_t) (int);void catchsigint(int signo)
{system("aplay /home/zhaoxr/wo.wav");printf("hello music\n");
}int main()
{sighandler_t handler;handler = signal(SIGINT,catchsigint);if(handler==SIG_ERR){perror("signal error");exit(1);}while(1);return 0;
}
7.sigaction函数
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>void docatch(int signo)
{while(1){printf("hello\n");sleep(1);}
}int main()
{int ret;struct sigaction act;act.sa_handler = docatch;sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask,SIGTSTP);act.sa_flags = 0;ret = sigaction(SIGINT,&act,NULL);if(ret<0){perror("sigaction error");exit(1);}while(1);return 0;
}
8.信号捕捉特性
9.内核实现信号捕捉过程
linux的基础知识——signal信号捕捉,信号集操作函数相关推荐
- linux中signal函数返回值,signal函数、sigaction函数及信号集操作函数
信号是与一定的进程相联系的.也就是说一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如一个进程可以忽略某些信号而只处理其他一些信号另外一个进程还可以选择如何处理信号.总之这些总与特定的进程相联 ...
- Day53 Linux setitimer函数 信号集操作函数 信号捕捉 SIGCHLD信号
目录 setitimer函数 信号集操作函数 1.信号集设定 2.igprocmask函数 3.sigpending函数 信号捕捉 1.signal函数 2.sigaction函数 SIGCHLD信号 ...
- WIFI基础知识-2.4GZH的信号为什么比5GHZ的信号好
WIFI基础知识-2.4GZH的信号为什么比5GHZ的信号好 其实如果你家里的路由器是双频路由,即同时支持2.4GHZ和5GHZ的信号.那么使用过程中,你可能会发现2.4GHZ的信号要比5GHZ的信号 ...
- Linux操作系统基础知识学习
Q1.什么是GNU?Linux与GNU有什么关系? A: 1)GNU是GNU is Not Unix的递归缩写,是自由软件基金会(Free Software Foundation,FSF)的一个项目, ...
- 权限认证php,2016年Linux认证基础知识:php做权限管理
2016年Linux认证基础知识:php做权限管理 在学习Linux认证过程中,每个人会遇到每个人不同的问题,或小或大,那么你知道在Linux下,php怎么做权限管理?下面跟yjbys小编来看看最新的 ...
- Linux系统编程32:进程信号之详解信号集操作函数(sigset_t ,sigpending,sigprocmask)
文章目录 (1)sigset_t (2)信号集操作函数 (1)sigset_t 前面说过,未决和阻塞分别用位图来表示,于是我们把保存位图这样的数据类型称为sigset_t,sigset_t称为信号集, ...
- Linux系统基础知识
Linux系统基础知识 1.在Linux系统中,以文件方式访问设备. 2. Linux内核引导时,从文件 /etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用 ino ...
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- Linux常用基础知识必备三之常用指令及操作
Linux常用基础知识必备三之常用指令及操作 1.vi和vim vi如何使用 vi几种模式下的操作指令 命令模式进入编辑模式 命令模式下的快捷键 底行模式(指按了esc键之后输入按键:后出现) 字符串 ...
最新文章
- static关键字和内存使用
- Github标星2.3k+!这个仓库提供了靠谱的入门人工智能的路线及资料!
- [转]HOWTO do Linux kernel development - take 3 (中文版)
- 计算机与生物学交叉学科,美国本科开设了哪些交叉学科?
- Spring Boot 2.3.0——以war方式打包失败[webxml attribute is required]解决方案
- 数据结构:哈希表(散列表)基础
- 在Angular应用的child Component里同时使用@Input和@Output
- 2013腾讯编程马拉松初赛第二场(3月22日) 小Q系列故事——为什么时光不能倒流 ---好水!!...
- 电子过载继电器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 在CrossOver中设置代理实现与特殊网段的网络连接
- Windows 常用的 CMD 命令
- android 绕过动态权限,android绕过permission验证及fork进程权限提升
- VC编程中,判断野指针
- 汇编篇 :关于地址总线与数据总线的换算
- Python-Selenium Webdriver+google chrome浏览器爬取中国知网的文献之二
- 家用计算机设置网络,手把手教您设置安装家庭无线网络
- 基于Java Swing的小游戏-连连看
- linux 注释批处理,Linux_批处理 正则表达式(findstr) 整理,语法 findstr [/b] [/e] [/l] [/r] [/s] - phpStudy...
- 关于学校邮箱收不到matlab验证短信
- 2654 最小距离最大
热门文章
- 阿里云 超级码力在线编程大赛初赛 第4场 题目3. from start to end
- LeetCode 280. 摆动排序
- LeetCode 702. 搜索长度未知的有序数组(二分查找)
- LeetCode 41. 缺失的第一个正数
- php接收二进制流,php接收二进制流【转】
- unity鼠标控制镜头旋转_Unity Camera教程之 摄像机跟随鼠标移动而旋转
- php管道的概念,让你的php命令行程序处理管道数据
- android wsdl封装,《android 解析WebService》
- python生成json_Python 生成json文件
- (二十四)【2021 ACL】OntoED: Low-resource Event Detection with Ontology Embedding