进程间通信——管道文件

来源:互联网 发布:厦门大学网络教育收费 编辑:程序博客网 时间:2024/05/16 19:39

一、进程间通讯

1、概念:

    每个进程各自有不同的进程地址空间,任何一个进程的全局变量在另一个进程中都不能访问,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,P1进程把要交换的数据从用户空间拷到内核缓冲区,P2进程再从内核缓冲区把数据读走。如下图所示。内核提供的这种机制称为进程间通信(IPC,InterProcess Communication )

2、方式

  能够实现进程间通信的方法有:管道信号量消息队列共享内存socket




二、管道

  管道是数据交换的通道、桥梁。管道允许在进程之间按先进先出的方式传送文件,是进程间通信的一种常见的方式。

 1、管道分为 FIFO有名管道(文件)和 pipe无名管道

   无名管道:用于相关进程(拥有一个共同的创建了它们的祖先进程)之间的通信,如父子进程。

   有名管道:可以应用于任何进程之间。

三、有名管道

  1、有名管道(文件):是一种特殊的文件,管道文件仅仅在文件系统目录树中存在的一个标示,并不需要存储  数据,不在磁盘占据空间(在磁盘上有对应的节点,但没有数据块,也就是说只是拥有一个名字和相应的访问权  限);当使用管道文件进行进程间通信时,在内存中开辟空间供使用;

  2、管道文件的创建及操作

   (1)创建管道文件命令:  mkfifo filename

      代码中创建管道文件的函数: mkfifo();

   (2) open:打开管道

       read:读管道内容

       write:向管道发送数据

       close:关闭管道

  3、注意:(1)有名管道,如果一个进程以只写打开,进程会在open阻塞运行,直到另一个进程以只读打开; 同理如果一个进程以只读打开,进程也会在open阻塞运行,直到另一个进程以只写打开;因此,当管道文件同时以读、写方式打开才有意义!

       (2)read端会阻塞运行,直到写端写入数据或者写端关闭。

四、无名管道

 1、无名管道:仅能应用于相关进程之间,不存在管道文件,实现依赖父子进程文件共享;

  2、无名管道的创建:int pipe(int fd[2])函数  // fd[0]为读端,fd[1]为写端;

      建立无名管道用pipe函数,一个管道就如一个打开的文件,主要包括2个file结构——分别用于读和写

 3、无名管道操作时,建立无名管道用pipe函数。管道操作分为以下步骤:

  (1)父进程调用pipe函数开辟管道,得到两个文件描述符指向管道的两端;

  (2)父进程用fork创建子进程,那么子进程也有两个文件描述符指向同一管道;

  (3)父进程关闭管道文件读端,子进程关闭写端。父进程可以往管道里写数据,子进程可以从管道中读数据,这样就在父子进程之间建立管道,实现进程间通信。