IPC信号

IPC-信号

一、信号的定义

1、用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。



2、信号是UNIX/Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。
***
3、信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

二、信号的分类(KILL)

2.1、kill -l 命令列出linux下所有的信号类型
kill -l KILL
得到指定信号的宏值。

SIGRTMIN 信号请求号介于SIGRTMIN和SIGRTMAX之间的信号是可靠的也叫实时信号,除此之外的都是不可靠的,也叫非实时信号
SIGRTMAX 信号请求号介于SIGRTMIN和SIGRTMAX之间的信号是可靠的也叫实时信号,除此之外的都是不可靠的,也叫非实时信号

图示每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有 定 义#define SIGINT 2。编号34以上的是实时信号,只讨论编号34以下的部分常用信号。

2.2、常用信号
| 信号名| 宏值| 含义| 硬件产生动作| 软件产生 |
| :---: | :--------:| :----: |:----: |
|SIGHUP| 1| 终端断线 | | kill -1 PID|
|SIGINT| 2| 中断 |Ctrl + C | kill -2 PID|
|SIGKILL| 9| 中断 | | kill -2 PID|
|SIGTERM| 15| 中断 | | kill -2 PID|
|SIGALRM| 2| 中断 | | kill -2 PID|
|SIGKSTOP| 19| 中断 |Ctrl + z | kill -2 PID|
|SIGCONT| 18| 中断 |fg/bg | kill -2 PID|

kill (9)六亲不认的杀掉
term(15)正常的退出进程
因为进程可能屏蔽某些信号,所以它们的用处也就不一样。。。

2.2、SIGINT (2)、SIGKILL(9)、 SIGTERM(15) 区别

SIGINT (9)
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
3) SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
SIGKILL(9)
SIGKILL既不能被应用程序捕获,也不能被阻塞或忽略,其动作是立即结束指定进程。通俗地说,应用程序根本无法“感知”SIGKILL信号,它在完全无准备的情况下,就被收到SIGKILL信号的操作系统给干掉了,显然,在这种“暴力”情况下,应用程序完全没有释放当前占用资源的机会。事实上,SIGKILL信号是直接发给init进程的,它收到该信号后,负责终止pid指定的进程。在某些情况下(如进程已经hang死,无法响应正常信号),就可以使用kill -9来结束进程。

SIGINT (15)
系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该signal后,将会发生以下的事情
1.程序立刻停止
2.当程序释放相应资源后再停止
3.程序可能仍然继续运行
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以
配置的。如果程序正在等待IO,可能就不会立马做出相应。也就是说,SIGTERM多半是会被阻塞的、忽略.

注意:
init进程不可杀死
SIGINT信号不可被屏蔽

四、信号的发生

信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。

五、信号的响应

进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作。注意,进程对实时信号的缺省反应是进程终止。
  Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。

七、Linux下信号编程举例

//Linux指令入门
http://c.biancheng.net/view/1068.html

参考文档
https://www.cnblogs.com/chinhao/p/4647861.html

https://blog.csdn.net/woxiaohahaa/article/details/52425469

2) SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

3) SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。

15) SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。

19) SIGSTOP
停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略

原文地址:https://www.cnblogs.com/retry/p/11679301.html

时间: 2024-10-04 17:00:26

IPC信号的相关文章

进程-IPC 信号和信号量 (二)

详细见:  https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%BA%8C).md 三 信号 3.1. 信号简介 信号是进程之间互相传递消息的一种方法,信号全称为软中断信号,也可称为软中断,它是实现IPC的方法之一. 信号是UNIX和Linux系统响应某些条件而产生的一个事件.进程之间可以互相通过系统调用kill发送软中断信号.内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件. 注:信号只是简单用来通知某进程发生了什么

linux进程通信(三)IPC信号

信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识.信号量在此过程中负责数据操作的互斥.同步等功能. 当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用.大于0,资源可以请求,等于0,无资源可用,进程会进入睡眠状态直至资源可用. 当进程不再使用一个信号量控制的共享资源时,信号量的值+1,对信号量的值进行的增减 操作均为原子操作,这是由于信号量主要的作用是维护资源的互斥或多

IPC——信号

Linux进程间通信——使用信号 一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止. 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动.通常信号是由一个错误产生的.但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程.一

IPC——线程信号问题

所有的线程共享相同的信号处理方式 主线程将SIGINT信号的处理方式设置为了捕获,那么所有的次线程共享这一处理方式,如果其中某个次线程改变了该信号的处理方式,那么所有的线程将共享这一改变. 回顾“信号屏蔽字”和“未决信号字” 作用 “信号屏蔽字”和“未决信号字”作用同进程信号,参考IPC——信号 修改信号屏蔽字函数 int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set,

转 学习linux下的c/c++编程

http://blog.csdn.net/byxdaz/article/details/3959680 1,先有linux环境搭minGW和cygwin都有点麻烦,最最简单的办法还是装个真正的linux,用虚拟机也好,在网络上的另一台机器也好.这样不仅快,而且你有了真正的环境.2.会C/C++语言(估计你会的)3.入门阶段熟悉gcc命令行,最基本的参数,如,-g,-W,-O,-o,-c 建议看man gcc(很大找想要的)4.编译第一个helloworld程序: 基本命令 gcc hellowo

linux进程管理(5)---进程消亡

一.目的 本文将讲述进程是如何消亡的.一个进程既有父进程又有子进程,因此进程消亡时,既要通知父进程,也要安排好子进程. 当前进程消亡时主要做了三件大事:释放当前进程占用的资源:为当前进程的子进程重新寻找"养父":通知当前进程的父进程,释放当前进程剩下的资源. 当前进程释放掉大多数进程资源后,只保留内核栈.structtask_struct数据结构:剩下的资源由父进程负责释放. linux调用sys_exit().sys_wait4()实现进程的消亡,代码可以在kernel/exit.c

深入分析linux调度机制

一.说明 本文以linux-2.4.10 为例主要分析Linux 进程调度模块中的schedule 函数及其相关的函数.另外相关的前提知识也会说明.默认系统平台是自己的i386 架构的pc. 二.前提知识 在进行schedule 分析之前有必要简单说明一下系统启动过程,内存分配使用等.这样才能自然过渡到schedule 模块. 首先是Linux各个功能模块之间的依赖关系: 可见进程调度是整个内核的核心.但这部分,我想说明的是,我的pc是怎样把操作系统从硬盘装载到内存中,并启动进程调度模块的.然后

Unix下的进程管理

进程的概述 进程的概念 直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统.操作系统会以进程为单位,分配系统资源,所以我们也说,进程是资源分配的最小单位. 进程调度中的三种状态 运行:当一个进程在处理机上运行时,则称该进程处于运行状态.处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行状态的进程只有一个.在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程. 就绪

nmon文件详解

nmon分析文件各sheet含义 sheet名称 sheet含义 SYS_SUMM 系统汇总,蓝线为cpu占有率变化情况,粉线为磁盘IO的变化情况: AAA 关于操作系统以及nmon本身的一些信息: BBBB 系统外挂存储容量以及存储类型: BBBC 系统外挂存储位置.状态以及描述信息: BBBD 磁盘适配器信息:(包含磁盘适配器名称以及描述) BBBE 包含通过lsdev命令获取的系统设备及其特征,显示vpaths和hdisks之间的映射关系: BBBG 显示磁盘组详细的映射关系: BBBL