千锋教育嵌入式物联网教程之系统编程篇学习-04
目录
alarm函数
raise函数
abort函数
pause函数
转折点
signal函数
可重入函数
信号集
sigemptyset()
sigfillset
sigismember()
sigaddset()
sigdelset()
代码讲解
信号阻塞集
sigprocmask()
alarm函数
相当于一个闹钟,默认动作是终止调用alarm函数的进程,其实也可以处理其他函数,在A进程中使用alarm函数,让B进程退出,至于场景你可以使用单片机的FreeRTOS场景去理解
raise函数
场景分析:比如A进程的功能实现完了,想退出进程了,那么就可以发信号给自己
相当于freertos中的删除任务,本任务的作用就是初始化,任务完成后,我就删除自己释放空间。至于raise会做什么处理我就不知道了,你只需要知道它有这个功能即可
getpid()获取自己的进程号
abort函数
注意:即使SIGABRT信号被加入到了阻塞集的话,一旦使用该函数,还是会被终止。你像上面的alarm函数,产生一个SIGALRM信号,假如SIGALRM这个信号加入到了阻塞集的话,那就无法立马响应了,这就是两者的区别
最后的提醒会有所不一样,alarm是闹钟
pause函数
等待信号的产生,一般是等待另外一个进程或者线程发送信号给我 ,就有点类似于freertos的信号量一样,我设置二值信号量阻塞等待,就有点类似于了。
因此举例的话,你可以创建子进程,父进程使用pause函数,等待子进程发信息给父进程
转折点
我们之前一直讲信号的默认处理方式,那么说明肯定不仅仅是默认处理方式,其处理方式我们可以设定,就像之前的alarm函数肯定不仅仅对调用着,也可以对其他的进程者,任何实现呢?
使用函数signal()
目的:使用alarm函数对其他进程进行暂停处理
signal函数
定义一个函数地址,void*fun();
回调函数使用,跟stm32的HAL库一样,通过信号区分哪一个信号来了
目的:子进程隔1s打印一次son,而父进程隔一秒打印father,并且都是死循环,
当父进程的循环变量为6时,使用alarm(3),并且使用signal函数让它处理子进程,
因此此时子进程会退出,而父进程继续执行#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>int main()
{__pid_t pid;pid = fork();if(pid < 0){perror("fork fail\n");exit(1);}else if(pid == 0){printf("son process\n");int son ;for(son=1;son>0;son++){sleep(1);printf("son\n");}}else{printf("father process\n");int fa = 0;for(fa=1;fa>0;fa++){sleep(1);printf("father\n");if(fa == 6)
{alarm(3);
printf("father is alarm\n");
signal();
}}}}
可重入函数
多个任务并发使用,其实就是可以被中断的代码,回来后能在原来的地方继续正常运行。但是我在使用的时候,并没有理解好该类函数的作用。留个印象即可,等之后深入的就可以回想起来
基于第二点:说明只能使用栈区
代码操作:进入函数时,首先保存此时的error的值,等该函数结束后,再恢复原值
信号集
将多个信号放在一起形成一个集合(结构体中的数组,这个数组保存的就是信号集),因此可以实现一个进程同时对多个信号进行处理(在宏观上,个人觉得)。不过信号集会与信号阻塞集联系在一起,他们可以配套使用
sigemptyset()
数据类型:sigset_t
sigfillset
理解一下功能,将信号集合设置为所有信号的集合,说明里面有所有的信号了
sigismember()
sigaddset()
sigdelset()
代码讲解
信号阻塞集
用于暂缓某一个信号的通知(传送),下面的b老师并没有直接跟a说你先讲课,我等你。而是静静的等待者,等下课了,再进去通知他,再结合前面的知识知道,b老师通知a老师去开会(信号到达),但是不一定a老师会去,这就看他对这个信号如何处理了,前面有讲过信号的处理
sigprocmask()
因此信号集与信号阻塞集一起使用
场景:将sigint(来源于Ctrl + c),添加到信号集,再把该信号集添加到阻塞集,那么我们按Ctrl + c该进程不会被退出(前提是该进程是死循环)
千锋教育嵌入式物联网教程之系统编程篇学习-04相关推荐
- 千锋教育嵌入式物联网教程之系统编程篇学习-01
目录 课程视频链接 笔记目的 什么是系统编程 如何操作内核的系统调用 系统调用的分类编辑 系统调用的返回值 系统调用IO函数 文件描述符 文件IO文件描述符与标准IO的文件指针对应关系 Man手册使 ...
- 千锋教育嵌入式物联网教程之系统编程篇学习-05
目录 无名管道 无名管道创建--pipe() 管道重点问题 无名管道读写规律 fcntl设置文件阻塞特性 文件描述符概述 文件描述符的复制-dup和dup2 dup函数 dup2 无名管道 进程间的 ...
- C语言基础大全(基于千锋教育超详细教程)
C语言基础 1.第一个c语言程序 #include <stdio.h> int main() {printf("hello world");return 0; } [外 ...
- 千锋教育python全集_千锋教育-Python逆战班1905期(完整版)
千锋教育面授课程包含HTML5大前端培训.JavaEE+分布式开发培训.Python全栈+人工智能培训.全链路UI/UE设计培训.云计算培训.全栈软件测试培训.大数据+人工智能培训.智能物联网+嵌入式 ...
- 千锋教育+计算机四级网络-计算机网络学习-01
目录 课程链接 最早的广域网 计算机网络发展阶段 计算机网络的定义与要点 英文单词网络术语与解释 计算机网络分类 广域网技术 城域网 局域网 个人局域网 五种基本的网络拓扑结构 误码率 电路交换网特 ...
- 千峰python 培训南京千锋教育IT培训赋能人才
10月31日,中国正式开启第五代移动通信网络(5G)商用时代,这也标志着中国通信发展史进入了一个新的里程碑.中国移动.联通.电信三大运营商纷纷推出5G套餐,超快的网速使得许多市民跃跃欲试.显然,5G商 ...
- 千锋教育python2104期总结day2
千锋教育python2104期总结day2 第一次总结: 基础语法和变量 目录 更改基础设置, 写出第一句代码 基础语法 输入和输出函数 变量 正文 1. 更改基础设置,写出第一句代码 1)设置pyc ...
- 千锋教育python2104期总结day14
千锋教育python2104期总结 第十三次总结: 常用系统模块和文件操作 目录 time模块 datetime模块 hashlib模块 文件操作 读写操作 数据存储操作 作业 正文 1.time模块 ...
- 千锋教育python2104期总结day15
千锋教育python2104期总结 第十四次总结: json和异常 目录 文件操作补充 json数据 异常模块 作业 正文 1.文件操作补充 打开不存在的文件 """ 如 ...
最新文章
- 4.Git基础-查看提交历史
- 动态SQL应用(成绩排名)
- [原]我装Solaris的艰苦经历
- .NET静态类的概念
- servlet返回数据给html_Servlet 简介
- oracle中创建一个用户,只能查看指定的视图,如何授权,创建别名
- 主板电源开关接口图解_主板跳线接法示意图,超详细适合DIY新手
- 服务器电源常见故障判断及处理方法
- 雷达多普勒频率计算公式_详细分析:合成孔径雷达成像技术
- python编程猜拳游戏_python代码实现猜拳小游戏
- linux文件解压缩加解密
- 如何安装Chrome扩展程序或插件
- 对比分析高速传输和同步软件:Aspera 与 镭速(Raysync)
- [vivado系列]Vivado软件的下载
- JS中typeof() !== 'undefined'的解释
- AX3600开启SSH功能
- CentOS7安装MariaDB的流程步骤
- linux番茄时钟,Linux 番茄时钟 定时 取消 快捷方式
- linux zmq环境配置,zmq安装与使用
- Struts2 - 异常处理: exception-mapping 元素
热门文章
- 超级使用体验==笔记本电脑+机械键盘(合体)敲击咔咔咔
- tab weui 页面切换_weui tabbar 切换
- C语言中关键字restrict的用法(linux 为 __restrict)
- 华为手机活了?今年出货量目标提升到4000万!底气从何而来?
- 网易互联网 笔试 8.20
- Latext安装(二)WinEdt安装+激活教程
- jQuary学习笔记
- 微信公众号自定义菜单关联小程序
- css学习笔记 day two
- Visual C++ 在windows 7 上预编译头错误unexpected precompiled header error, simply rerunning the compiler migh