进程间通信
进程间的通信管道和信号
进程间的通信IPC(Interprocesses Communication)就是进程之间进行数据传输。
linux提供的IPC方法包括:管道(pipe)、命名管道(FIFO)、信号(signal)、内存映射(mapped memory)、消息队列(message queue)、信号量(semaphoe)、共享内存(share memory)、套接字
(Socket)。
管道是最古老的UNIX IPC方式,其特点是:
1、半双工,数据在同一时刻只能在一个方向上流动。
2、只能在具有公共祖先的进程之间使用,通常管道由一个进程创建,然后由该进程调用fork,此后父子进程
就可以应用该管道。
3、管道对于管道两端的进程而言,就是一个文件,不属于某个文件系统,并且只存在内存中。
4、数据从管道的一端写入,从另一端读出。
5、管道没有名字。
6、管道的缓冲区是有限的
7、管道所传输的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,多少字节是一个消息。
8、写入管道的消息读完就从管道中消失了。
管道的创建
#include
int filedes[2];
int pipe(filedes);
经由参数 filedes返回两个文件描述符:
filedes[0]为读而打开,
filedes[1]为写而打开。
extern into dup(int _fd)
功能复值一个打开的文件描述符fd,返回新的文件描述符。
新的文件描述符是系统文件中最小的可用的非负文件描述符
extern int dup2(int _fd,int _fd2)
参数:
_fd: 要复制的文件描述符
_fd2:返回的新文件描述符。
fd2是小于文件描述符最大允许值的非负整数,如果fd2是一个已经打开的文件描述符,则首先关闭该文件,然后在复制。
功能:
复制一份打开的文件描述符fd。返回新的文件描述符fd2
dup2 返回的文件描述符fd2与fd有以下共同点:
相同的打开文件(或管道)
相同的打开文件指针(即两个文件共享一个文件指针)
相同的访问模式。(读写读取写入)
相同的文件状态标识。
命名管道,又称为FIFO。
命名管道只能用于共同的祖先的进程间的通信(继承管道文件描述符)。命名管道则克服了这种限制。
FiFO提供了一个与之关联的路径名,就可以通过该命名管道进行通信。(通信的进程无需有共同的祖先)
命名管道的读写与创建
#include
#include
int mkfifo( const char *pathname ,mode_t mode)
mkfifo函数的第一个参数是一个普通的路径名,也就是创建后的FIFO的名字。第二个参数与打开普通文件的OPEN()函数中mode参数相同。
如果mkfifo的第一个参数是一个已经存在的路径名,会返回一个错误的EEXIST。
阅读(2155) | 评论(0) | 转发(0) |