有名管道的通信

有名管道的使用方式与无名管道不同。有名管道可被任何知道其名字的进程打开和使用。为了使用有名管道,进程要先建立它,并与他的一端相连。创建有名管道的进程叫做服务器进程,存取管道的其他进程叫做客户进程。通信双方必须首先创建有名管道后,才能打开管道进行读写。当文件不再需要时,要显示删除。

进程间使用有名管道实现通信时,必须有三次同步。

第一次是打开同步。当一个进程以读方式打开有名管道时,若已有写者打开过,则唤醒写者后继续前进,否则,睡眠等待写者。当一个进程以写方式打开有名管道时,若已有读者打开过,则唤醒读者后继续前进,否则等待读者。

第二次是读写同步。其同步方式与pipe相同。允许写者超前读者1024个字符。当一次写超过1024时,超过的字符要写入时,则写者必须等待。读者从有名管道读时,若没有数据可读则等待。若有数据可读,读完后要检查有无写者等待,若有,则唤醒写者。而且要求读写两方要随时检查通信的另一方是否还存在,一旦有一方不存在,应立即终止通信过程。

第三次同步是关闭同步。当一个写进程关闭有名管道时,若发现有进程睡眠等待从管道读,则唤醒它,被唤醒进程立即从读调用返回。当一个读进程关闭有名管道时,若发现有进程睡眠等待向管道写,则唤醒它,并向他发一个提示错误条件的信号后返回。最后一个关闭有名管道的进程,释放该管道占用的全部盘快及相应主存i节点。

有名管道打开后,就可以使用读写命令进行读写,读写完成后就立即关闭。有名管道文件关闭后,文件本身并没有消失。有名管道的读、写和关闭动作与普通文件完全相同。

下面是一个有名管道的使用的例子

#include
#include
#include
#include
#include
#include
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);
}

有名管道的通信_第1张图片

 

你可能感兴趣的:(操作系统课程设计)