一.命名管道又被称为FIFO文件,是为了解决不具有亲缘关系的进程间通信的问题。

二.命名管道有两种创建方式。一种是在Shell交互下建立的一个命名管道,二是在程序中使用系统函数建立命名管道。

  创建命名管道的系统函数有两个:mknod和mkfifo,两个函数均建立在头文件sys/stat.h,函数原型如下:

#include<sys/types.h>

#include<sys/stat.h>

int mknod(const char *path,mode_t mod,dev_t dev);

int mkfifo(const char *path,mode_t mode);

 其中函数mknod中参数path为穿件的命名管道的全路径名,mode 为创建的命名管道的模式,指明其存取权限,dev为设备值,该值取决于文件创建的种类,它只在创建设备文件时才会用到。

这两个函数调用成功都返回0,调用失败都返回-1.

  注意:调用open打开命名管道的进程可能会被阻塞,但如果同时用读写方式(O_RDWR)打开,则一定不会导致阻塞;如果以只读(O_RDONLY)方式打开,则调用open()函数的进程将会被阻塞直到有写方打开管道;以写方式(O_WRONLY)打开也会阻塞直到有读方式打开管道。

fifo writed端:

  1 #include<stdio.h>

  2 #include<string.h>

  3 #include<sys/types.h>

  4 #include<sys/stat.h>

  5 #include<fcntl.h>

  6 #define _PATH_ "./.tmp2"

  7 #define _SIZE_ 100

  8 int main()

  9 {

 10         int ret=mkfifo(_PATH_,S_IFIFO|0666);

 11         if(ret<0)

 12         {

 13                 perror("mkfifo");

 14                 return -1;

 15         }

 16         int fd=open(_PATH_,O_WRONLY);

 17         if(fd<0)

 18         {

 19                 perror("open");

 20                 return -1;

 21         }

 22         char buf[_SIZE_];

 23         while(1)

 24         {

 25 

 26                 memset(buf,'\0',sizeof(buf));

 27                 printf("you want to say:");

 28                 gets(buf);

 29                 fflush(stdout);

 30                 int wet=write(fd,buf,strlen(buf)+1);

 31                 if(wet<0)

 32                 {

 33                         perror("write");

 34                         break;

 35                 }

 36         }

 37         close(fd);

 38         return 0;

 39 }


fifo read端:

 1 #include<stdio.h>

  2 #include<string.h>

  3 #include<sys/types.h>

  4 #include<sys/stat.h>

  5 #include<fcntl.h>

  6 #include<unistd.h>

  7 #define _PATH_ "./.tmp2"

  8 #define _SIZE_ 100

  9 int main()

 10 {

 11         int fd=open(_PATH_,O_RDONLY);

 12         if(fd<0)

 13         {

 14                 perror("open");

 15                 return -1;

 16         }

 17         char buf[_SIZE_];

 18         memset(buf,'\0',sizeof(buf));

 19         while(1)

 20         {

 21                 int ret=read(fd,buf,sizeof(buf));

 22                 if(ret<=0)

 23                 {

 24                         perror("read");

 25                         break;

 26                 }

 27                 printf("%s\n",buf);

 28         }

 29         close(fd);

 30         return 0;

 31 }

运行结果:

进程间通信之命名管道_fifo


进程间通信之命名管道_fifo_02