第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课-信号通讯编程相关推荐

  1. 信号通讯编程,王明学learn

    信号通讯编程 在Linux系统中,信号(signal)同样也是最为古老的进程间通信机制. 一.信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示), ...

  2. 《实用VC编程之玩转控件》第15课:Tree树形控件

    本文转载自:VC驿站 https://www.cctry.com/thread-297465-1-1.html 1.控件简介: Tree树形控件也是我们编程过程中比较常用的一个控件,而且在其他软件中也 ...

  3. AI一分钟 | 教育部公布高中新课标,编程、算法思维成必修内容;李彦宏否认百度会“All in AI”

    一分钟AI 李彦宏表示自己做事一向留有余地,否认百度会"All in AI". 教育部发布最新高中课程改革方案,对学生在编程.算法.人工智能和开源硬件方面的要求大幅度提升. 罗永浩 ...

  4. Emojify - v2 吴恩达老师深度学习第五课第二周编程作业2

    吴恩达老师深度学习第五课第二周编程作业2,包含答案! Emojify! Welcome to the second assignment of Week 2. You are going to use ...

  5. pwm控制舵机转动角度程序_Mixly 第15课 舵机的使用

    第15课  舵机的使用 舵机的旋转不像普通电机那样只是转圈圈,它可以根据你的指令旋转到0至180度之间的任意角度然后精准的停下来.舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的. ...

  6. 13.无名管道通讯编程

    13.无名管道通讯编程 1.进程间的通信: Linux作为典型的多进程操作系统,进程与进程之间肯定需要信息交流,这就需要进程通信. 2.进程通信的目的: 1.数据传输:一个进程需要将数据发送给另一个进 ...

  7. C语言探索之旅 | 第二部分第一课:模块化编程

    C语言之父 Dennis Ritchie -- 简书作者 谢恩铭 转载请注明出处 第二部分第一课:模块化编程 上一课是C语言探索之旅 | 第一部分第十课:练习题+习作,至此,我们[C语言探索之旅]的第 ...

  8. python是什么意思讯_初步理解Python进程的信号通讯

    信号的概念 信号(signal)-- 进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT 终止进程 中断进程 (contro ...

  9. 15个热门的编程趋势及15个逐步走向衰落的编程方向

    Peter Wayner是InfoWorld的一名特约编辑,也是一个多产的作家.除了InfoWorld之外,他还经常为纽约时报和连线杂志撰写文章.近日,Peter撰写了一篇文章,谈到了未来15个热门的 ...

  10. 计算机病毒小学教师资格证面试,小学信息技术人教版四年级上册第15课《病毒防治及时做》优质课公开课教案教师资格证面试试讲教案...

    小学信息技术人教版四年级上册第15课<病毒防治及时做>优质课公开课教案教师资格证面试试讲教案 1教学目标 1.计算机病毒的定义及特征; 2.计算机病毒造成的危害,树立对计算机病毒的防范意识 ...

最新文章

  1. Linux中断处理驱动程序编写【转】
  2. PCL点云库学习笔记 点云的欧式聚类
  3. 大数据算法:排位问题(2)
  4. Android(安卓)一个简单的聊天界面的实现(eclipse实现)
  5. 平台积分体系设计方案
  6. 关于在用异步消息处理机制使用Message.Obtain()方法(而非New Message)获得一个Message对象的好处
  7. java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务
  8. 稀缺生物科技美妆海报PSD分层模板,看得见的超前感!
  9. docker run后台启动命令_Docker命令-docker run
  10. Win10提示“您未连接到nvidia gpu的显示器”的解决方法
  11. Github上托管项目
  12. 推荐几款好用的富文本编辑器
  13. 绝对纯净:龙行天下GHOST XP SP3软件自选安装纯净版 2010 V13.0 2010年6月
  14. 如何通过视频转换器将qsv格式转换成mp4格式
  15. Sublime 设置中文方法
  16. java pdf 盖章
  17. “某某云词典” – 纠结的初体验
  18. 取消职称英语计算机考试的文件,2010年有没有可能取消职称英语及计算机考试...
  19. 制作美观GIS地图,掌握这些技巧就够了
  20. Python!Python!

热门文章

  1. 狂神说Reids完结篇
  2. Android View的滚动原理简单解析
  3. 在现有计算机内安装另一个硬盘的原因,您有一台运行Windows7的计算机。您在计算机中安装第二个内部硬盘驱动器。您尝试创建一个系统映像,.. - 上学吧找答案...
  4. mockito 外部接口_原创 |使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (五)第一个单元测试...
  5. 新地址 贴吧_建议收藏 | 新媒体人必备5大工具
  6. python快速排序函数_两种方法在Python中实现快速排序
  7. cryptapi双向认证_2019 08 28 netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》...
  8. 用SQLAlchemy执行原生SQL
  9. 示例1---从记事本中读取数值,然后写到数组中
  10. 如何运行导入的项目_从0到1学习Flink》—— Flink 项目如何运行?