1. 无名管道只能在有亲缘关系的进程中进行通信,针对这一缺点进行改进,出现有名管道。
有名,即文件系统中存在对应文件节点,每个文件节点都有一个inode号。
有名管道的文件类型是p,之前文件IO中认识的文件类型有:普通文件-,目录文件d,链接文件l。
2. 创建方式:
open: 普通文件
mkfifo: 创建管道
socket:创建套接字
mknod:字符设备文件
mkdir: 目录文件
链接文件:ln -s
3. mkfifo使用方法与open类似,有名管道创建完后,在当前目录中生成文件。
这个文件不占用磁盘空间,只有innode号,和套接字、字符设备文件、块设备文件一样。普通文件,符号链接文件及目录文件不仅有inode号,还占用磁盘空间。
4. 实例,创建有名管道
#include "stdio.h"
#include "unistd.h"
#include "stdlib.h"
int main()
{
int ret;
ret=mkfifo("./myfifo",0777);
if(ret <0)
{
printf("creat myfifo failure\n");
return -1;
}
printf("creat myfifo sucess\n");
return 0;
}
执行结果:
alex@alex-virtual-machine:/extra/process/004$ ls
mkfifo.c
alex@alex-virtual-machine:/extra/process/004$ gcc mkfifo.c
alex@alex-virtual-machine:/extra/process/004$ ls
a.out mkfifo.c
alex@alex-virtual-machine:/extra/process/004$ ./a.out
creat myfifo sucess
alex@alex-virtual-machine:/extra/process/004$ ls
a.out mkfifo.c myfifo
alex@alex-virtual-machine:/extra/process/004$ ls -lh
total 12K
-rwxrwxr-x 1 alex alex 7.2K 1月 21 13:44 a.out
-rwxrwxrwx 1 smbuser smbuser 233 9月 15 2015 mkfifo.c
prwxrwxr-x 1 alex alex 0 1月 21 13:44 myfifo
alex@alex-virtual-machine:/extra/process/004$
从执行结果可以看出,生成了myfifo管道文件,文件大小0.