Linux的进程编程-之二-进程间通信(信号)

本文详细介绍了Linux进程间通信中的信号(Signal)机制,包括信号的生命周期、安装、发送、等待以及处理函数。信号是异步的,可由硬件异常、软件中断、用户操作或系统调用产生。信号处理方式包括忽略、捕捉和执行默认行为。信号分为可靠(实时)和不可靠(非实时)两种,不同类型的信号有不同的处理和行为。信号的安装主要通过signal()和sigaction()函数完成,发送则涉及kill(), raise(), abort()等函数。信号的等待包括sigwait(), pause()等函数。文章还提到了信号编程的注意事项,如选择可重入函数以保证程序稳定性。" 50708393,5612928,STM32时钟系统配置与寄存器详解,"['单片机', '嵌入式开发', 'STM32开发', '时钟配置']
摘要由CSDN通过智能技术生成

1    Linux进程间通信

linux下的IPC基本上是从Unix上的IPC继承而来的。而Unix的两大主力AT&T的Bell Lab及BSD在IPC方面的侧重点有所不同。AT&T对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;BSD则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来,如图示:

最初Unix IPC包括 :信号、管道

System V IPC包括  :System V消息队列、System V信号灯、SystemV共享内存区

Posix IPC包括         :Posix消息队列、Posix信号灯、Posix共享内存区

由于Unix版本的多样性,IEEE开发了一个独立的Unix标准,称为计算机环境的可移植性操作系统界面(PSOIX)。现有大部分Unix版本都遵循POSIX标准,而Linux从一开始就遵循POSIX标准。linux下进程间通信的几种主要手段:信号、信号灯、管道、消息队列、共享内存、套接口。

1.1         信号-Signal

信号是在软件层次上对中断机制的一种模拟,进程收到一个信号等同于处理器收到一个中断。信号是异步的,一个进程不必等待信号的到达,事实上,进程也不知道信号什么时候到达。

下面的情况可以产生signal:

1.硬件中断,如除0(SIGFPE),非法内存访问(SIGSEV);

2.软件中断,如alarm超时(SIGALRM),读进程终止之后又向管道写数据(SIGPIPE);

1.按下特殊的组合键,例如CTRL+C(SIGINT),CTRL+Z(SIGTSTP);

3.kill函数可以对进程发送signal;

4.kill命令,实际上是对kill函数的一个封装实现;

 

进程可以通过三种方式来响应一个信号:

1.忽略signal。大部分signal都可以被ignore,除了SIGKILL和SIGSTOP。

2.捕捉signal。内核调用我们定义的信号处理函数,SIGKILL和SIGSTOP无法被捕捉。

3.执行缺省行为。

 

部分signal的缺省行为不仅终止进程,同时还会产生core dump,也就是生成一个名为core的文件,其中保存了退出时进程内存的镜像,可以用来调试。但是在下面情况,不会生成core文件:

1.当前进程不属于当前user;

2.当前进程不属于当前group;

3.用户在当前目录下无写权限;

4.core文件已存在,用户无写权限;

5.文件大小超出限制。

 

信号的种类:

非实时(不可靠)信号:可能丢失,不支持排队(pending);小于SIGRTMIN的信号。

实时(可靠)信号:支持排队(pending),不会丢失;SIGRTMIN和SIGRTMAX之间的信号。

 

信号名

 

信号含义

SIGHUP

1

T

1、终端关闭时,SIGHUP信号会被发送到session leader以及作为job提交的进程(即用&提交的进程);

2、session leader退出时,SIGHUP信号会被发送到session中前台进程组中的每一个进程;

3、若进程退出导致进程组成为孤儿进程组,且进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),SIGHUP信号和SIGCONT信号会被发送到该进程组中的每一个进程。

孤儿进程组定义为:该进程组中每个成员的父进程或者是本组的一个成员,或者是属于其它session的成员。

SIGINT

2

T

程序终止信号,在用户键入INTR字符(Ctrl-C)时发出,用于通知前台进程组中的所有进程,终止进程。

SIGQUIT

3

D

程序终止信号,在用户键入QUIT字符(Ctrl-\)时发出,用于通知前台进程组中的所有进程,终止进程。与SIGINT不同的时,进程收到SIGQUIT终止时会产生core文件。

SIGILL

4

D

执行了非法指令,通常是因为可执行文件本身出现错误,或者试图执行数据段,堆栈溢出时也有可能产生这个信号。

SIGTRAP

5

D

SIGTRAP is the signal thrown by process when a condition arises that a debugger has requested to be informed of.

SIGABRT

6

D

调用abort( )函数产生的信号。

SIGIOT

6

D

与SIGABRT同义

SIGBUS

7,10,10

D

非法地址,包括内存地址对齐(alignment)出错。

SIGFPE

8

D

发生致命算术运算错误时发出,包括浮点运算错误,溢出及除数为0等所有的算术运算错误。

SI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值