第三季-第15课-信号通讯编程
第15课-信号通讯编程
15.1 核心理论
1. 信号
在古老的战场上,信号是最有效,最直接的通讯方式;在linux系统中,信号(signal)同样也是最古老的进程间通讯机制。
2. 信号处理流程
进程A/内核---(1)选择信号-----(2)发送信号-----(3)处理信号----进程B。
3. 信号类型
Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示),其中常见的信号有:
SIGKILL:杀死进程
SIGSTOP:暂停进程
SIGCHLD:子进程停止或结束时用来通知父进程
15.2 函数学习
1. 发送信号
(1)函数名
kill
(2)函数原形
int kill(pid_t pid,int sig);
(3)函数功能
向一个进程发送信号(send signal to a process)。
(4)所属头文件
#include<sys/types.h>
#include<signal.h>
(5)返回值
成功:0
失败:-1
(6)参数说明
pid:pid>0,pid参数指向接收信号的进程
sig:指明要发送的信号。
2. 处理信号
(1)函数名
signal
(2)函数原形
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
(3)函数功能
设置信号的处理方式(sets the disposition of the signal signum to handler)。
(4)所属头文件
#include<signal.h>
(5)返回值
成功:返回处理函数指针
失败:SIG_ERR
(6)参数说明
signum:要处理的信号
handler:函数指针,设置对应信号的处理方式。有三种取值:(1)SIG_IGN忽略这个信号不处理,(2)SIG_DFL交给系统去处理,(3)用户自定义的函数:交给用户自定义的函数来处理。
15.3 综合实例编程
A、B进程利用信号通讯。这里我们要一个新的函数pause,下面首先对它进行一个简单的介绍。
(1)函数名
pause
(2)函数原型
int pause(void);
(3)函数头文件
#include<unistd.h>
(4)函数功能
等待信号(wait for signal)
(5)返回值
成功:捕捉了信号返回-1
失败:EINTR
(6)参数
无
范例:
B进程,接收信号
#include<signal.h>
#include<unistd.h>
void myfuc(int a)
{
printf("Process B received SIGINT!\n");
}
void main()
{
signal(SIGINT,myfuc);
pause();
}
当我们运行这段程序的时候,看到终端处于等待的状态。
我们先使用命令的方式,测试接收程序的实现。打开另一个终端首先输入:ps aux命令查看我们运行的改程序的进程,将序列号记住。然后输入命令:kill -n SIGINT 3637
我们会看到操作的起一个终端开始打印:Process B received SIGINT!
A进程,发出信号:
#include<signal.h>
#include<sys/types.h>
#include<stdio.h>
void main(int argc,char *argv[]) /*因为要把进程B的进程号传过来,我们要设置参数*/
{ /*argc表示信号个数,argv[]表示信号*/
pid_t pid;
pid = atoi(argv[1]); /*argv[0]是程序的名字,argv[1]是B进程的进程号*/
kill(pid,SIGINT);
}
注:pid的获取由命令行来获取,命令行传进来的是一个字符串,pid是个整数,用atoi函数将字符串转换成整数。
运行结果:先运行B进程,然后ps aux查看B进程的进程号(如3710),运行./ap 3710,在等待状态的B进程打印:Process B received SIGINT!
转载于:https://www.cnblogs.com/free-1122/p/11351127.html
第三季-第15课-信号通讯编程相关推荐
- 信号通讯编程,王明学learn
信号通讯编程 在Linux系统中,信号(signal)同样也是最为古老的进程间通信机制. 一.信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示), ...
- 《实用VC编程之玩转控件》第15课:Tree树形控件
本文转载自:VC驿站 https://www.cctry.com/thread-297465-1-1.html 1.控件简介: Tree树形控件也是我们编程过程中比较常用的一个控件,而且在其他软件中也 ...
- AI一分钟 | 教育部公布高中新课标,编程、算法思维成必修内容;李彦宏否认百度会“All in AI”
一分钟AI 李彦宏表示自己做事一向留有余地,否认百度会"All in AI". 教育部发布最新高中课程改革方案,对学生在编程.算法.人工智能和开源硬件方面的要求大幅度提升. 罗永浩 ...
- Emojify - v2 吴恩达老师深度学习第五课第二周编程作业2
吴恩达老师深度学习第五课第二周编程作业2,包含答案! Emojify! Welcome to the second assignment of Week 2. You are going to use ...
- pwm控制舵机转动角度程序_Mixly 第15课 舵机的使用
第15课 舵机的使用 舵机的旋转不像普通电机那样只是转圈圈,它可以根据你的指令旋转到0至180度之间的任意角度然后精准的停下来.舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的. ...
- 13.无名管道通讯编程
13.无名管道通讯编程 1.进程间的通信: Linux作为典型的多进程操作系统,进程与进程之间肯定需要信息交流,这就需要进程通信. 2.进程通信的目的: 1.数据传输:一个进程需要将数据发送给另一个进 ...
- C语言探索之旅 | 第二部分第一课:模块化编程
C语言之父 Dennis Ritchie -- 简书作者 谢恩铭 转载请注明出处 第二部分第一课:模块化编程 上一课是C语言探索之旅 | 第一部分第十课:练习题+习作,至此,我们[C语言探索之旅]的第 ...
- python是什么意思讯_初步理解Python进程的信号通讯
信号的概念 信号(signal)-- 进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT 终止进程 中断进程 (contro ...
- 15个热门的编程趋势及15个逐步走向衰落的编程方向
Peter Wayner是InfoWorld的一名特约编辑,也是一个多产的作家.除了InfoWorld之外,他还经常为纽约时报和连线杂志撰写文章.近日,Peter撰写了一篇文章,谈到了未来15个热门的 ...
- 计算机病毒小学教师资格证面试,小学信息技术人教版四年级上册第15课《病毒防治及时做》优质课公开课教案教师资格证面试试讲教案...
小学信息技术人教版四年级上册第15课<病毒防治及时做>优质课公开课教案教师资格证面试试讲教案 1教学目标 1.计算机病毒的定义及特征; 2.计算机病毒造成的危害,树立对计算机病毒的防范意识 ...
最新文章
- Linux中断处理驱动程序编写【转】
- PCL点云库学习笔记 点云的欧式聚类
- 大数据算法:排位问题(2)
- Android(安卓)一个简单的聊天界面的实现(eclipse实现)
- 平台积分体系设计方案
- 关于在用异步消息处理机制使用Message.Obtain()方法(而非New Message)获得一个Message对象的好处
- java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务
- 稀缺生物科技美妆海报PSD分层模板,看得见的超前感!
- docker run后台启动命令_Docker命令-docker run
- Win10提示“您未连接到nvidia gpu的显示器”的解决方法
- Github上托管项目
- 推荐几款好用的富文本编辑器
- 绝对纯净:龙行天下GHOST XP SP3软件自选安装纯净版 2010 V13.0 2010年6月
- 如何通过视频转换器将qsv格式转换成mp4格式
- Sublime 设置中文方法
- java pdf 盖章
- “某某云词典” – 纠结的初体验
- 取消职称英语计算机考试的文件,2010年有没有可能取消职称英语及计算机考试...
- 制作美观GIS地图,掌握这些技巧就够了
- Python!Python!
热门文章
- 狂神说Reids完结篇
- Android View的滚动原理简单解析
- 在现有计算机内安装另一个硬盘的原因,您有一台运行Windows7的计算机。您在计算机中安装第二个内部硬盘驱动器。您尝试创建一个系统映像,.. - 上学吧找答案...
- mockito 外部接口_原创 |使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (五)第一个单元测试...
- 新地址 贴吧_建议收藏 | 新媒体人必备5大工具
- python快速排序函数_两种方法在Python中实现快速排序
- cryptapi双向认证_2019 08 28 netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》...
- 用SQLAlchemy执行原生SQL
- 示例1---从记事本中读取数值,然后写到数组中
- 如何运行导入的项目_从0到1学习Flink》—— Flink 项目如何运行?