Linux IPC通信机制

Linux IPC通信机制主要有3种。


1.管道(pipe)

由于基于fork机制,管道只能用于具有亲缘关系的进程间通信,如父子进程和兄弟进程之间的通信。管道是由内核管理的一个缓冲区。管道的一端连接一个进程的输出,这个进程会向管道中写入信息;管道的另一端连接一个进程的输入,这个进程读出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。


实现细节:
在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。参考[1]链接。这两个 file 数据结构,它们定义的文件操作例程地址是不同的,其中一个是向管道中写入数据的例程地址,而另一个是从管道中读出数据的例程地址。这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管道这一特殊操作。

函数原型:

#include <unistd.h>

int pipe(int filedes[2]);

其中:
filedes[0]用于读出数据,读取时必须关闭写入端,即close(filedes[1]);

filedes[1]用于写入数据,写入时必须关闭读取端,即close(filedes[0])。


2.命名管道(named PIPE)

为了解决管道只能用于具有亲缘关系的进程间通信,Linux 提供了FIFO方式连接进程, 又叫做命名管道(named PIPE).命名管道在文件系统中有对应的路径存在。当一个进程以读(r)的方式打开该文件,而另一个进程以写(w)的方式打开该文件,那么内核就会在这两个进程之间建立管道,所以命名管道实际上也由内核管理,不与硬盘打交道。之所以叫FIFO,是因为命名管道本质上是一个先进先出的队列数据结构,最早放入的数据被最先读出来,从而保证信息交流的顺序。FIFO只是借用了文件系统来为管道命名的。写模式的进程向FIFO文件中写入,而读模式的进程从FIFO文件中读出。当删除FIFO文件时,管道连接也随之消失。FIFO的好处在于我们可以通过文件的路径来识别管道,从而让没有亲缘关系的进程之间建立连接。


函数原型:

#include <sys/types.h>
#include <sys/stat.h>


int mkfifo(const char *filename, mode_t mode);
int mknode(const char *filename, mode_t mode | S_IFIFO, (dev_t) 0 );

其中filename为管道名称。

具体的读写规则,可以参考连接[2]。

3. 信号(Signal)

信号是在软件层次上对中断机制的一种模拟,是异步的。每种信号类型都有对应的信号处理程序(也叫信号的操作),大多数信号的默认操作就是结束接收信号的进程。

当信号发生的时候,可以有三种选择(称之为Disposition of the signal或者Action associated with a signal)

1).忽略信号。大部分信号都可以Ignore,除了SIGKILL和SIGSTOP,这是为了提供一个确定的方法来Stop或者Kill一个Process。此外,如果我们忽略部分硬件异常产生的信号,进程的行为未定义。
2).捕捉信号。可以让内核来调用我们所指定的函数。SIGKILL和SIGSTOP无法捕捉。
3).执行缺省行为。如果不做任何处理,则执行缺省动作。大部分信号的缺省行为都是中止进程。

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

函数原型:
#include <signal.h>

void (*signal(int signo, void (*func)(int)))(int)

其中:signo 是信号名;func的值是常量SIG_IGN、SIG_DFL或当接到信号发生时要调用的函数的地址。
如果为SIG_IGN,则向内核表示忽略此信号。(记住我们不能忽略SIGKILL和SIGSTOP;如指定SIG_DFL时,我们设置信号相关的动作为默认值。

PS
参考: 
[1]http://www.cnblogs.com/biyeymyhjob/archive/2012/11/03/2751593.html
[2]http://blog.csdn.net/MONKEY_D_MENG/article/details/5570468
[3]http://www.cnblogs.com/biyeymyhjob/archive/2012/08/04/2622265.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值