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

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

你可能感兴趣的:(Linux,linux,编程,signal,数据结构,struct,timer)