一 、IPC简介
IPC是类UNIX系统中的一个专业术语。
进程间通信就是在不同进程之间传递或交换信息。需要一个不同进程都能访问的存放数据的
“
公共场所
”
,即数据存放介质。
3类
“
公共场所
”
进程的用户空间是互相独立的,但共享存储区可公用。
系统空间是公用,但是只有内核具有访问权限。
外设,两个进程可以通过磁盘上的普通文件、或者通过
“
注册表
”
(Windows系统)、或者通过第三方数据库进行信息的相互交换。
¡
三种常用的IPC技术
管道
(普通)管道,有两个局限:
l
半双工,只能单向传送数据;
l
只能在同源进程(在进程创建上具有亲缘关系)间使用。
命名管道(FIFO),可以在不相关的进程之间进行通讯。
SysV IPC
三种类型: 消息队列、信号量和共享内存,它们在实现上具有很大的相似性。
最初在AT&T公司的System V.2 UNIX版本中引入。
套接字
主要用于网络通信,可以在不同主机的进程间相互交换信息
二、管道
1、pipe函数
可通过调用pipe函数来创建一个管道。
filedes 用于返回文件描述符的数组。
返回值 成功时返回0; 出错时返回-1,并设置errno变量。
说明
filedes[0]为读而打开,filedes[1]为写而打开。filedes[1] 的输出将作为filedes[0]的输入。写入写端的数据将被内核缓存,直到从读端读出。
通常,调用pipe函数的进程会接着调用fork,以创建一个父进程与子进程之间的IPC通道。
fork之后有两个操作选择,这取决于所需建立的管道的数据流向。根据不同流向,在父子进程中要关闭相应端口。
在通信过程中的读、写规则:
当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,以指示到了文件结束处。
如果写一个读端已被关闭的管道,则产生SIGPIPE信号。如果忽略该信号或者捕获该信号并从其处理程序返回,则write出错返回,errno设置为EPIPE。
在写管道时,已写但尚未被读走的字节数应小于或等于PIPE_BUF(4096B).
示例
2、popen和pcolse函数
这两函数用于实现:创建管道,fork子进程,然后关闭管道的不使用端,在子进程中exec一个shell以执行一条命令,然后等待命令的终止。
command 将在子进程中执行的命令行字符串。
type 打开方式,应为"r"或"w"二者之一,含义与fopen的第 二个参数一样。
返回值
成功时,popen返回一个文件流指针,pclose返回command的终止状态。
出错时,popen返回NULL,pclose返回-1。
说明
函数popen先调用fork函数创建子进程,然后调用exec函数以执行command,最后返回一个标准I/O文件指针。
popen打开的文件流是全缓存的。
函数pclose关闭标准I/O流,并等待command命令执行结束,最后返回shell的终止状态。
popen函数执行command的方式同system()函数,相当于在Shell下执行:“sh –c command”。
示例
三、命名管道
先入先出队列(First In First Out Queue)
FIFO也是一种文件类型。FIFO的路径名存在于文件系统中,创建命名管道类似于创建文件。
可调用mkfifo函数来创建一个命名管道。
pathname 要打开或创建的文件的名字。
mode 存取访问权限,同open函数的mode参数。
返回值 成功时返回0,出错时返回-1并设置errno。
说明
新创建的FIFO文件的所有者是当前进程的有效用户,文件的所属组是当前进程的有效组或父目录的所属组。
一旦用mkfifo创建了一个FIFO文件,就可用系统I/O调用(close, read, write, unlink, etc.) 来操作它。
未指定O_NONBLOCK时,以读方式打开FIFO将阻塞到某个其他进程以写方式打开该FIFO。反之,以写方式打开FIFO将阻塞到某个其他进程以读方式打开它。
指定了O_NONBLOCK,则以读方式打开FIFO会立即返回。但是,以写的方式打开没有读端的FIFO将以失败返回,并设置errno为ENXIO。
示例