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 |