手记

【学习打卡】第2天 C气象数据中心 第二章 2-7节

课程名称:C/C++气象数据中心实战,手把手教你做工业级项目

课程章节:2-7linux信号  

主讲老师: 吴从周


课程内容:

  1. 介绍并熟悉linux系统信号的基本概念,包括系统信号的类型,数量,信号名称等基础概念性知识。

  2. 描述并演示linux系统信号的处理过程,采用vi进行模拟程序的编写, 通过编写信号处理函数,将系统信号的处理过程在终端界面直观的演示。

  3. 对于linux系统信号在实际应用中的示例进行叙述,直观表达了系统信号在实际应用中的作用。

  4. 介绍并演练了信号的发送过程,练习了c语言中提供的kill库函数。



课程收获:

1、信号的基本概念 

信号(signal)是软件中断,是进程之间相互传递消息的一种方法,用于通知进程发生了事件,但是,不能给进程传递任何数据。一般在头文件中实用signal()函数进行信号的处理,通过设置信号捕捉函数后,将调用信号处理函数,进而进行预期操作。

信号产生的原因有很多,在Linux下,可以用kill和killall命令发送信号。

2、信号的类型 

在linux的系统信号中,共有64种,以下是经常使用的10余种,分别包含了6种不同的默认处理动作和特有的信号值。

在其中处理动作一项中的字母含义如下

A 缺省的动作是终止进程。

B 缺省的动作是忽略此信号,将该信号丢弃,不做处理。

C 缺省的动作是终止进程并进行内核映像转储(core dump),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员 提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。

D 缺省的动作是停止进程,进入停止状态的程序还能重新继续,一般是在调试的过程中。

E 信号不能被捕获。

F 信号不能被忽略。


3、信号的处理 

进程对信号的处理方法有三种:

1)对该信号的处理采用系统的默认操作,大部分的信号的默认操作是终止进程。

2)设置中断的处理函数,收到信号后,由该函数来处理。

3)忽略某个信号,对该信号不做任何处理,就像未发生过一样。

signal函数可以设置程序对信号的处理方式。


4、系统信号在实际开发中的作用

服务程序运行在后台,如果想让中止它,杀掉不是个好办法,因为程序被杀的时候,程序突然死亡,没有安排善后工作。

如果向服务程序发送一个信号,服务程序收到这个信号后,调用一个函数,在函数中编写善后的代码,程序就可以有计划的退出。

向服务程序发送0的信号,可以检测程序是否存活。



5、信号应用示例和发送信号

在实际开发中,在main函数开始的位置,程序员会先屏蔽掉全部的信号。

  for (int ii=1;ii<=64;ii++) signal(ii,SIG_IGN);

这么做的目的是不希望程序被干扰。然后,再设置程序员关心的信号的处理函数。

程序在运行的进程中,如果按Ctrl+c,将向程序发出SIGINT信号,编号是2。

采用“kill 进程编号”或“killall 程序名”向程序发出的是SIGTERM信号,编号是15。

采用“kill -9 进程编号”向程序发出的是SIGKILL信号,编号是9,此信号不能被忽略,也无法捕获,程序将突然死亡。

设置SIGINT和SIGTERM两个信号的处理函数,这两个信号可以使用同一个处理函数,函数的代码是释放资源。


不管是用Ctrl+c还是kill,程序都能安全的退出。








0人推荐
随时随地看视频
慕课网APP