有名管道介绍。
使用pipe创建的无名管道只能用于具有亲缘关系的进程之间,这就大大限制了管道的使用。
有名管道的出现就是为了解决这个限制问题,有名管道可以使互不相关的两个进程实现彼此通信。通信的过程就是通过路径名来指出管道文件,然后在建立了管道联系之后两个进程就可以把它当做一个普通文件一样进行读写操作,但是有名管道是严格遵循FIFO的规则,也就是所谓的先进先出,如果从有名管道中读取数据的话总是从开始出返回数据,显然如果是增加数据的话就是添加到末尾,而且不支持一些定位操作如lseek等。
在我们使用有名管道的时候可以把管道当成一个文件,但是与普通文件不同的是有名管道需要考虑阻塞问题。在有关管道的使用中阻塞与不阻塞的主要区别如下:
对于读进程:
- 若该管道是阻塞打开,且当前FIFO内没有数据,则对度进程而言将一直阻塞直到有数据写入。
- 若该管道是非阻塞打开,则不管当前FIFO中有没有数据,读进程都回立即执行操作并返回。
对于写进程:
- 若该管道是阻塞打开,则写进程而言将一直阻塞直到有读进程读出数据。
- 若该管道是非阻塞打开,则不管当前FIFO中有没有读操作,都会执行写操作并返回。
简单的说就是,打开一个管道之后,如果是非阻塞模式,则不论管道的两边(一边读一边写)有没有正在操作,都会直接返回。但是如果是阻塞模式,则必须要保证管道两边都要有进程同时操作,否则就会阻塞。
创建有名管道。
可以通过”mknod 管道名 p”来直接创建一个有名管道,然后就可以直接使用read、write等操作。
也可以使用mkfifo函数来创建或者打开一个管道。
mkfifo函数介绍:
- 所需头文件:#include < sys/types.h> 、#include < sys/stat.h>
- 函数原型:int mkfifo(const char* filename,mode_t mode)
- 参数介绍:第一个就是管道名的名称,第二个参数是打开的模式,共有以下几种:
- O_RDONLY:读管道。
- O_WRONLY:写管道。
- O_RDWR:读写管道。
- O_NONBLOCK:非阻塞管道。
- O_CREAT:如果该文件不存在,就创建一个新的文件。
- O_EXCL:如果用O_CREAT时文件存在,那么可能会返回错误信息,如果使用这个参数则可以检测文件是否存在。
- 返回值:成功:0;错误:-1.
使用FIFO可能返回的错误信息:
- EACCESS:参数filename所指定的目录路径无可执行的权限。
- EEXIST:参数filename所指定的文件已存在。
- ENAMETOOLONG:参数filename的路径名称太长。
- ENOENT:参数filename包含的目录不存在。
- ENOSPC:文件系统的剩余空间不足。
- ENOTDIR:参数filename路径中的目录存在但却非真正的目录。
- E