第三季-第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

时间: 2024-10-28 13:20:51

第三季-第15课-信号通讯编程的相关文章

信号通讯编程,王明学learn

信号通讯编程 在Linux系统中,信号(signal)同样也是最为古老的进程间通信机制. 一.信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示),其中常见的信号有: SIGKILL:杀死进程 SIGSTOP:暂停进程 SIGCHLD:子进程停止或结束时用来通知父进程 二.函数学习 2.1 发送信号 2.1.1 函数名 kill 2.1.2 函数原形 int kill(pid_t pid,int sig); 2.1.3 函数功能 向进程发送信号

第三季-第16课-信号量互斥编程

第16课-信号量互斥编程 16.1 公示栏问题(问题引入) 1. 问题描述 这里面我们举一个小例子.在一个班级里就有一个公示栏,A同学想写“数学课考试”,B同学想写“英语课取消”.但是有一个时间,A同学只写下了“数学课”三个字,没来得及写后面的内容就出去了,但是这个时候B同学来写下了“英语课取消”.这样让同学们看来就成了“数学课英语课取消”,给班级的其他同学造成了歧义. 这也就是我们说的同时访问一个资源,造成了,数据的混乱.若是有多个进程同时访问一个资源,同样会造成这个问题. 2. 问题程序化

信号通讯编程

1.核心理论 信号类型:linux系统支持的所有信号均定义在/usr/include/asm/signal.h中,其中常见的信号有: SIGKILL:   杀死进程 SIGSTOP: 暂停进程 SIGCHLD:子进程停止或结束时用来通知父进程 2.函数学习 发送信号 函数名:kill 函数原型:int kill(pid_t pid, int sig); 函数功能:向进程发送信号 头文件:<sys/types.h> <signal.h> 返回值:成功:0  失败:-1 参数说明:pi

第三季-第17课-信号量同步编程

第17课-信号量同步编程 17.1 核心概念--进程同步 一组并发进程进行互相合作.互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步. 17.2 生产者消费者问题 1. 问题描述 这里面有两个角色:生产者和消费者.假设生产者生产的产品需要两步才能完成并且使用.但是,当生产者刚刚完成了对产品的第一步加工的时候,产品就被消费者买走了.可是他们之间并没有相应的沟通,这就导致,消费者会以为他买到了完成的产品. 2. 程序化 在文件夹里面创建producer.c和customer.c文件,同时创

第15课-信号量同步编程

1.进程同步:各进程按照一定的顺序执行的过程.异步就不一定有顺序,而是随机的执行.一组并发进程进行互相合作,互相等待,使得各进程按照一定的顺序执行的过程.2.system系统调用可以按照字符串方式调用系统命令.3.生产者只需要释放信号量:消费量只需要获取而不需要释放4.信号量初始值等于0,在互斥通讯中大于05.生产者:(1)创建信号量集合的键值(ftok函数)(2)创建信号量(semget函数)(3)设置信号量初始值为0(semctl(信号量ID,第几个信号量,什么操作[,欲设置的值])函数)(

第13课-信号通讯

1.信号:在Linux中信号也是最为古老的通信机制2.信号处理流程:(1)选择信号(2)发送信号(3)处理信号3.信号类型:(1)SIGHUP:终端发出的结束信号(2)SIGINT:键盘中断信号(3)SIGKILL:结束接收信号的进程(杀死进程)(4)SIGTERM:kill命令发出的信号(5)SIGSTOP:暂停进程(6)SIGCHLD:子进程停止或结束的时候用来通知父进程4.忽略信号:有些信号可以被忽略,但是SIGKILL和SIGSTOP不可忽略,他们是要终止和停止进程.5.执行用户希望的操

第14课-信号互斥编程

1.产生背景:有些资源呗多个进程同时访问的时候,可能出现数据混乱的现象2.定义:信号量有名信号灯.主要是用来保护临界资源(进程互斥).进程可以根据他判定是否可以访问临界资源.还可以用于进程同步.实质:一个数字操作:获取和释放.利用信号量的值判断是否可以操作,大于0可以.0不可以.所以在创建操作之前一般要保证初始值是1.可以使用semctl函数来获取和设置初始值.3.分类:(1)二值信号量:信号灯的值只能是0和1(2)计数信号量:信号灯的值可以取任意非负值4.和文件的区别(1)打开信号量得到标识符

大数据Spark蘑菇云前传第15课:Scala类型参数编程实战及Spark源码鉴赏(学习笔记)

前传第15课:Scala类型参数编程实战及Spark源码鉴赏 本課課程: Spark源码中的Scala类型系統的使用 Scala类型系統编程操作实战 Spark源码中的Scala类型系統的使用 classOf[RDD[_]] 這個也是类型系統 這里的意思是說 B 這種類型必需至少是 A 這樣類型 Ordering Scala类型系統编程操作实战 作為類型系統最大的就可以對類型進行限制,在Scala 中的類型系統,他本身也作為對象.e.g. 我們可以建立 Person 這個類,現在可以建立一個什麼

【C语言探索之旅】 第二部分第一课:模块化编程

内容简介 1.课程大纲 2.第二部分第一课: 模块化编程 3.第二部分第二课预告: 进击的指针,C语言王牌 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量