一.命名管道又被称为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 }
运行结果: