文档章节

Head First C 学习日志 第十章 进程间通信 捕捉信号

AlexTuan
 AlexTuan
发布于 2016/04/17 17:23
字数 667
阅读 32
收藏 0

Head First C 第十章 进程间通信 捕捉信号

关于信号

信号是操作系统控制程序的方式,举个栗子,操作系统在看到用户输入了Ctrl+C时,就会向程序发送中断信号。 信号映射表

信号 处理函数
SIGURG 不做事情
SIGINT 调用exit()

捕捉信号然后运行自己的代码

有时候你希望别人打断你的程序时运行自己的代码。假设进程打开了一些文件或网络连接,你希望在退出之前把它们关闭,并且做一些清理工作。在这里引入sigaction结构。 sigaction是一个函数包装器 sigaction是一个结构体,它有一个函数指针,siagction告诉操作系统进程收到某个信号时该调用哪个函数

sigaction的创建方法如下
	struct sigaction action;
	action.sa_handler = handler;
	sigemptyset(&action.sa_mask);
	action.sa_flag = 0;

sigemptyset用于设置信号,在信号被使用前必须调用sigemptysetsigfillsetsigemptyset在man中的函数原型和解释是:

	int sigemptyset(sigset_t *set);

The sigemptyset() function initializes a signal set to be empty.

将信号初始化设置为空。 处理器必须接收信号参数 信号是一个整型值,如果你创建了一个自定义处理函数,就需要接收一个整型参数:

	void diediedie(int sig) {
	  puts("Goodbye cruel world...\n");
	  exit(1);
	}
用sigaction()注册sigaction

创建sigaction以后,需要用sigaction()函数注册,使操作系统知道它的存在。

	int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);

sigaction()函数接收3个参数,信号,动作,旧动作(可以传NULL)。

将创建和初始化封装成一个函数
	int catch_signal(int sig, void (*handler)(int)) {
	struct sigaction action;
	action.sa_handler = handler;
	sigemptyset(&action.sa_mask);
	action.sa_flags = 0;
	return sigaction(sig, &action, NULL);
}

这样只要把信号和处理器传给catch_signal()函数,就可以设置信号处理器了。

给进程发送信号

用kill命令发送信号

运行程序后,可以使用Ctrl+C发送一个中断信号,如果想发送其他信号,可以用在终端下用kill命令,格式为kill -信号 进程号 kill -INT 1739的效果和Ctrl+C一样,都是发送中断信号。

在进程内发送信号

在进程内可以使用raise()函数向自己发送信号。 通常会在自定义的信号处理器中使用raise(),这样程序就能在接收到低级别的信号时引发更高级别的信号,这叫做信号升级

例程代码

signal handler sample

© 著作权归作者所有

AlexTuan
粉丝 4
博文 27
码字总数 17966
作品 0
程序员
私信 提问
Head First C 第十章 进程间通信 闹钟

Head First C 第十章 进程间通信 闹钟 主要介绍一个函数,,的作用是:接收一个无符号整型参数,作为定时的秒数,系统会计时,时刻到达时,给进程发送一个SIGALRM的信号。 关于alarm() 注意 ...

AlexTuan
2016/04/17
40
0
Head First C 学习日志 第十章 进程间通信 输入输出重定向

Head First C 第十章 进程间通信 创建进程只是个开始如果你想控制运行中的进程,向进程发送数据或读取它的输出,该怎么办?通过进程间通信,进程可以合力完成某件工作。 进程内部一瞥 进程含...

AlexTuan
2016/04/09
61
0
UNIX环境高级编程 第十章:信号

什么是异步事件:简单点来说,就是,你一边看书,又一边在听歌。两者之间互不干扰。编程中最常见的异步事件,就是ajax调用。页面没有刷新,但某个局部已经更新。你打开淘宝,你会发现,页面先...

qiangzhenyi1207
2018/01/16
0
0
进程间通信几种方式

一、进程间通信概述 进程通信有如下一些目的: A、数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 B、共享数据:多个进程想要操作共享数据,一个进...

wangxuwei
2016/02/16
137
0
linux系统编程(3)

一 线程间同步 同步:相互之间配合完成一件事情 互斥:保证访问共享资源的完整性(有你没我) POSIX 线程中同步:使用信号量实现 信号量 : 表示一类资源,它的值表示资源的个数 对资源访问: p操作...

baiweibi
2017/12/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

社区投稿 | 线程简介和 MySQL 调试环境搭建

作者:高鹏 文章末尾有他著作的《深入理解MySQL主从原理 32讲》,深入透彻理解MySQL主从,GTID相关技术知识。 本文节选自《深入理解MySQL主从原理》第29节 注意:本文分为正文和附件两部分,...

爱可生
27分钟前
6
0
DDOS攻击可以分为什么类型?怎么样才能解决?

DDoS 是一种多源网络攻击,其目的是针对终端用户扰乱其网络的资源或服务。其不断进化的复杂性能够造成各种各样的伤害,例如欺诈以及勒索等。DDoS 攻击通常透过多重受损的系统或者装置注入殭尸...

云漫网络Ruan
31分钟前
5
0
从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念

作者| 阿里巴巴资深技术专家、CNCF 9个 TCO 之一 李响 一、什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译...

阿里巴巴云原生
31分钟前
4
0
修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)

上周在定位问题时,发现Spring容器实例化Bean的时候抛出异常,为了查看更详细的信息,决定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationBeanPostProcessor类的代码,在里面打印...

程序员欣宸
34分钟前
5
0
MongoDB集群配置

MongoDB集群配置 2019年06月30日 13:21:05 2014Team 阅读数 77更多 分类专栏: MongoDB 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文...

linjin200
34分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部