无名管道的缺点是无法在非亲属之间进行通信,由于无名管道的缺点,对其进行改进后形成了有名管道。
所谓有名,即在文件系统中存在一个这样的文件节点,每一个文件节点都有一个inode号,而且这是一个特殊的文件类型:p管道类型。
管道文件只有inode号,不占有磁盘空间。
如何创建管道文件?
运用mkfifo函数创建管道文件。
函数名 | mkfifo |
---|---|
头文件 | #include<sys/types.h> , #include<sys/stat.h> |
函数形式 | int mkfifo (const char* filename ,mode_t mode) |
参数 | 管道文件创建的文件名(需要包含路径)和权限,创建的文件权限和umask有关 |
返回值 | 成功返回:0 失败返回:-1 |
注意 | mkfifo函数只创建了管道文件,并没有在内核创建管道,只有通过open函数打开文件时,管道才会创建 |
程序实例:
在当前目录先创建管道文件:
int main(){
int fiforet;
fiforet = mkfifo("./myfifo",0777); //在当前目录下创建管道文件 权限与umask有关
if(fiforet < 0){
printf("Creat fifo failure\n");
}
printf("Creat fifo success\n");
printf("fiforet=%d\n",fiforet);
return 0;
}
不同的(非亲缘关系)进程间通信:
int main(){ //发送端
int fiforet;
int fd,i;
char inter = 0;
fiforet = mkfifo("./fifo",0777); //创建管道文件
if(fiforet < 0){
printf("Creat fifo failure\n");
}
printf("Creat fifo success\n");
printf("fiforet=%d\n",fiforet);
fd = open("./fifo",O_WRONLY); //打开管道文件
if(fd < 0){
printf("open fifo failure\n");
}
printf("open fifo success\n");
inter = 1;
write(fd,&inter,1); //写入
sleep(3);
for(i = 0;i <5;i++){
printf("Have send message\n");
}
return 0;
}
int main(){ //接收端
int fiforet;
int fd;
char inter;
fd = open("./fifo",O_RDONLY);
if(fd < 0){
printf("open fifo failure\n");
}
printf("open fifo success\n");
read(fd,&inter,1);
printf("inter = %d",inter);
if(inter == 1){
printf("Have received message\n");
}
return 0;
}
程序运行结果:
发送端:
接收端: