文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

为什么?老程序员申请加薪至30K遭拒愤然辞职,公司转眼花35K招新

身在职场,经常会暗自打听同事工资,尤其是得知身边新入职同事的工资居然比自己高,还高出一大截时,心里自然很不平衡,一心想要离职。 那么,为什么公司宁愿花高价招聘新员工也不愿意给老员...

Java技术剑
20分钟前
7
0
云桌面到底是什么,企业该用云桌面吗

随着云计算和大数据时代的到来,当前企业里讨论最多的话题之一就是:企业到底要不要用云桌面这个话题的,有的人说企业应该使用云桌面的,因为可以降低使用成本和简化运维管理,同时也有的人说...

GZASD
25分钟前
5
0
技术分享 | gh-ost 原理剖析

作者简介: 杨奇龙,网名“北在南方”,7年DBA老兵,目前任职于杭州有赞科技DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。 一、简介 上一篇文章(gh-ost ...

爱可生
28分钟前
5
0
手机短信删除了怎么恢复?几个方法就能恢复

  手机短信删除了怎么恢复?前几天有个小伙伴收到了一条来着面试的通知,这个面试对他很重要,但是可气的是刚好在清理手机里面的垃圾短信,然后收到了短信之后又被删除了,却又不知道该怎么...

科技第六人
43分钟前
5
0
浅谈Builder建造者模式

一、前言 Builder建造者模式和模板模式非常像,但是也有区别,模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在Builder模式之中,父类和子类都不用关心怎么处理...

青衣霓裳
47分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部