Linux信号signal的介绍和示例
如何让程序在后台运行
在之前的章节中,如果要运行程序,在命令提示行下输入程序名后回车,程序被执行,然后等待程序运行完成。在程序运行的过程中,可以用Ctrl+c中止它。
在实际开发中,我们需要让程序在后台运行,不受界面的影响,也不让程序员等待,例如前几章节的socket服务端程序。
如果想让程序在后台运行,有两种方法。
1、加“&”符号
如果想让程序在后台运行,执行程序的时候,命令的最后面加“&”符号。
如:
./book242 &
程序就在后台运行了。
在后台运行的程序,用Ctrl+c无法中断,并且就算终端退出了,程序仍在后台运行。
如果终端退出了,后台运行的程序将由系统托管。
在第一张图中,book249的父进程是4555,第二张图中,book249的父进程是1。
2、采用fork
另一种方法是采用fork,主程序执行fork,生成一个子进程,然后父进程退出,留下子进程继续运行,子进程将由系统托管。
示例:
上图中,突出显示的就是新增的代码。
上图中,子进程的父进程是系统进程。
3、如何让中止后台程序
问题来了,程序在后台运行了,离开了终端控制,用Ctrl+c上也无法中止,那怎么让它停下来呢?暂时用一个笨方法:杀了它。
杀程序有两个方法:
1)killall 程序名
killall book249
2)先用“ps -ef|grep 程序名”找到程序的进程编号,然后用“kill 进程编号”
signal信号
signal信号是Linux编程中非常重要的部分,接下来将详细介绍信号机制的基本概念、Linux对信号的实现和使用,以及有关信号的几个系统调用(库函数)。
signal信号是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。信号是进程控制的一部分。
1、信号的基本概念
软中断信号(signal,又简称为信号)用来通知进程发生了事件。进程之间可以通过调用kill库函数发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。
收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认操作,大部分的信号的默认操作是终止进程。
2、信号的类型
发出信号的原因很多,这里按发出信号的原因简单分类,以了解各种信号:
信号名 |
信号值 |
默认处 理动作 |
发出信号的原因 |
SIGHUP |
1 |
A |
终端挂起或者控制进程终止 |
SIGINT |
2 |
A |
键盘中断Ctrl+c |
SIGQUIT |
3 |
C |
键盘的退出键被按下 |
SIGILL |
4 |
C |
非法指令 |
SIGABRT |
6 |
C |
由abort(3)发出的退出指令 |
SIGFPE |
8 |
C |
浮点异常 |
SIGKILL |
9 |
AEF |
采用kill -9 进程编号 强制杀死程序。 |
SIGSEGV |
11 |
C |
无效的内存引用 |
SIGPIPE |
13 |
A |
管道破裂:写一个没有读端口的管道 |
SIGALRM |
14 |
A |
由alarm(2)发出的信号 |
SIGTERM |
15 |
A |
采用“kill 进程编号”或“killall 程序名”通知程序。 |
SIGUSR1 |
30,10,16 |
A |
用户自定义信号1 |
SIGUSR2 |
31,12,17 |
A |
用户自定义信号2 |
SIGCHLD |
20,17,18 |
B |
子进程结束信号 |
SIGCONT |
19,18,25 |
进程继续(曾被停止的进程) |
|
SIGSTOP |
17,19,23 |
DEF |
终止进程 |
SIGTSTP |
18,20,24 |
D |
控制终端(tty)上按下停止键 |
SIGTTIN |
21,21,26 |
D |
后台进程企图从控制终端读 |
SIGTTOU |
22,22,27 |
D |
后台进程企图从控制终端写 |
处理动作一项中的字母含义如下
A 缺省的动作是终止进程。
B 缺省的动作是忽略此信号,将该信号丢弃,不做处理。
C 缺省的动作是终止进程并进行内核映像转储(core dump),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员 提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。
D 缺省的动作是停止进程,进入停止状况以后还能重新进行下去。
E 信号不能被捕获。
F 信号不能被忽略。
3、signal库函数
signal库函数可以设置程序对信号的处理方式。
包含头文件:
#include <signal.h>
函数声明:
sighandler_t signal(int signum, sighandler_t handler);
参数signum表示信号的编号。
参数handler表示信号的处理方式,有三种情况:
1)SIG_IGN:忽略参数signum所指的信号。
2)一个自定义的处理信号的函数,信号的编号为这个自定义函数的参数。
3)SIG_DFL:恢复参数signum所指信号的处理方法为默认值。
程序员不关心signal的返回值。
4、信号有什么用
服务程序运行在后台,如果想让它中止,杀了它不是个好办法,因为程序被杀的时候,程序突然死亡,没有释放资源,会影响系统的稳定。还有,用Ctrl+c与杀程序是相同的效果。
如果能向后台程序发送一个信号,后台程序收到这个信号后,调用一个函数,在函数中编写释放资源的代码,程序就可以有计划的退出,安全而体面。
信号还可以用于服务程序抓包等,这是较复杂的应用,暂时不介绍。
5、示例
在实际开发中,在main函数开始的位置,程序员会先屏蔽掉全部的信号。
for (int ii=0;ii<50;ii++) signal(ii,SIG_IGN);
这么做的目的是不希望程序被干扰。然后,再设置程序员关心的信号的处理函数。
程序员关心的信号有三个:SIGINT、SIGTERM和SIGKILL。
程序在运行中,如果按Ctrl+c,将向程序发出SIGINT信号,信号编号是2。
采用“kill 进程编号”或“killall 程序名”向程序发出的是SIGTERM信号,编号是15。
采用“kill -9 进程编号”向程序发出的是SIGKILL信号,编号是9,此信号不能被忽略,也无法捕获,程序将突然死亡。
所以,程序员只要设置SIGINT和SIGTERM两个信号的处理函数就可以了,这两个信号可以使用同一个处理函数,函数的代码是释放资源。
以下只截取与信号有关的部分代码。
运行结果
不管是用Ctrl+c还是kill,程序都能体面的退出。
发送信号
Linux操作系统提供了kill命令向程序发送信号,C语言也提供了kill库函数,用于在程序中向其它进程或者线程发送信号。
函数声明:
int kill(pid_t pid, int sig);
kill函数将参数sig指定的信号给参数pid 指定的进程。
参数pid 有几种情况:
1)pid>0 将信号传给进程识别码为pid 的进程。
2)pid=0 将信号传给和目前进程相同进程组的所有进程,常用于父进程给子进程发送信号。
3)pid=-1 将信号广播传送给系统内所有的进程,例如系统关机时,会向所有的登录窗口广播关机信息。
sig:准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在运行。
返回值说明: 成功执行时,返回0;失败返回-1,errno被设为以下的某个值。
EINVAL:指定的信号码无效(参数 sig 不合法)。
EPERM:权限不够无法传送信号给指定进程。
ESRCH:参数 pid 所指定的进程或进程组不存在。
版权声明
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道
如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!
如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!
Linux信号signal的介绍和示例相关推荐
- linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc
[计算机]Linux 信号signal处理机制 Linux 信号signal处理机制 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使 ...
- Linux 信号signal\sigaction
转发:作者,故事狗 https://www.jianshu.com/p/f445bfeea40a Linux 信号signal 对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号.信 ...
- linux signal用法,Linux 信号 signal 用法详解及注意事项
Linux 信号 signal 用法详解及注意事项 1) SIGHUP 本信号在用户终端连接 (正常或非正常) 结束时发出, 通常是在终端的控 制进程结束时, 通知同一 session 内的各个作业, ...
- Linux信号signal介绍,sigaction结构体,signal()函数,sigaction()函数
信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号).应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉.进程收到一 ...
- (转载)Linux 信号signal处理机制
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...
- 非常好的一篇对linux信号(signal)的解析
[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...
- Linux 信号signal处理机制
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...
- 非常好的一篇对linux信号(signal)的解析 (转载)
Linux信号(signal) 机制分析 转载至:https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html [摘要]本文分析了Linux ...
- Linux 信号(signal)
目录 1 信号的本质 2 信号列表 3 信号发送时机 3.1 内核自动给进程发送信号 3.2 进程给进程发送信号 4 信号处理时机 5 统一事件源 1 信号的本质 软中断信号(signal,又简称为信 ...
最新文章
- acwing算法题--直方图中最大的矩形
- k8s Service之ClusterIP示例
- CentOS 6.3 下用ntfs-3g挂载Windows NTFS分区
- 补习系列(20)-大话 WebSocket 与 尬聊的实现
- 方便快捷的php长文章分页函数,PHP长文章分页的一种实现方法
- 网络大学计算机统考缺考,2020网络教育统考缺考后会有什么影响
- 票据的生命周期与人的灵魂
- python装饰器详解-python中的装饰器详解
- unity2d自动生成敌人_【A*Pathfinding】超级简单的Unity2D寻路
- Arp病毒专杀工具下载及其防治解决方案
- 电磁兼容的PCB设计(一)
- Python 的 setup.py 详解
- 五合一建站系统YouDianCMS开源啦
- Sentiment Embeddings with Applications to Sentiment Analysis
- linux网络编程相关函数(一)
- 开学季哪些数码产品值得一看?开学季推荐五款值得入手的好物
- Android上传蒲公英平台脚本
- java泛型--桥方法
- CCF A类会议或期刊----多视图,多模态近两年论文
- 做出刷屏文字的6大哲学
热门文章
- Python 3.8实现支持断点续传的网络文件下载功能
- Python+tkinter根据窗体大小自动缩放并显示图像
- 微课|玩转Python轻松过二级(2.2.1节):算术运算符
- Python查找包含指定字符串的所有Office文档
- Python标准库collections中与字典有关的类
- Python版快速排序算法
- ios开发 循环引用 检测_iOS开发——Block引起循环引用的解决方案
- Linux 线程到底是什么(比喻+图解)
- android+adb+push到系统下,Android adb push 应用到app/system
- c++ vs2015 播放音乐_Linux 中的十大开源视频播放器