有名管道的使用方式与无名管道不同。有名管道可被任何知道其名字的进程打开和使用。为了使用有名管道,进程要先建立它,并与他的一端相连。创建有名管道的进程叫做服务器进程,存取管道的其他进程叫做客户进程。通信双方必须首先创建有名管道后,才能打开管道进行读写。当文件不再需要时,要显示删除。
进程间使用有名管道实现通信时,必须有三次同步。
第一次是打开同步。当一个进程以读方式打开有名管道时,若已有写者打开过,则唤醒写者后继续前进,否则,睡眠等待写者。当一个进程以写方式打开有名管道时,若已有读者打开过,则唤醒读者后继续前进,否则等待读者。
第二次是读写同步。其同步方式与pipe相同。允许写者超前读者1024个字符。当一次写超过1024时,超过的字符要写入时,则写者必须等待。读者从有名管道读时,若没有数据可读则等待。若有数据可读,读完后要检查有无写者等待,若有,则唤醒写者。而且要求读写两方要随时检查通信的另一方是否还存在,一旦有一方不存在,应立即终止通信过程。
第三次同步是关闭同步。当一个写进程关闭有名管道时,若发现有进程睡眠等待从管道读,则唤醒它,被唤醒进程立即从读调用返回。当一个读进程关闭有名管道时,若发现有进程睡眠等待向管道写,则唤醒它,并向他发一个提示错误条件的信号后返回。最后一个关闭有名管道的进程,释放该管道占用的全部盘快及相应主存i节点。
有名管道打开后,就可以使用读写命令进行读写,读写完成后就立即关闭。有名管道文件关闭后,文件本身并没有消失。有名管道的读、写和关闭动作与普通文件完全相同。
下面是一个有名管道的使用的例子
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int mknod(const char *pathname,mode_t mode,dev_t dev);
char string[]="this is a example to show fifo communication";
int main(int argc,char * argv[])
{
int fd;
char buf[256];
int i;
mknod("/home/test/1/fifo",010777,0);
if(argc==2)
fd=open("fifo",O_WRONLY);
else
fd=open("fifo",O_RDONLY);
for(i=0;i<26;i++)
{
if(argc==2){
printf("\n I have wrote: %s",string);
write(fd,string,45);
string[0]+=1;
}
else{
read(fd,buf,256);
printf("\nThe context by I have read is:! %s",buf);
buf[0]='\0';
}
}
close(fd);
}