正由于这无名管道的缺点,对无名管道进行改进:有名管道。
所谓的有名,即文件系统中存在这个一样文件节点,每一个文件节点都有一个inode号
而且这是一个特殊的文件类型:p管道类型。
创建这个文件节点,不可以通过open 函数,open 函数只能创建普通文件,不能创建特殊文件(管道-mkdifo,套接字-socket,字符设备文件-mknod,块设备文件-mknod,符号链接文件-ln –s,目录文件mkdir)
管道文件只有inode号,不占磁盘块空间,和套接字、字符设备文件、块设备文件一样。普通文件、符号链接文件及目录文件,不仅有inode号,还占磁盘块空间。
mkfifo 用来创建管道文件的节点,没有在内核中创建管道。
只有通过open 函数打开这个文件时才会在内核空间创建管道。
int mkfifo(const char *filename, mode_t mode);
功能:创建管道文件
参数:管道文件文件名,权限。
创建的文件权限仍然和掩码umask有关系。
返回值:创建成功返回0,创建失败返回-1。
例1:mkfifo的用法。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int ret;
ret = mkfifo("./myfifo", 0777);
if(ret < 0)
{
printf("create myfifo fail\n");
return -1;
}
printf("create myfifo success\n");
return 0;
}
例2:通过管道实现无亲缘关系进程间通信