- 姓名:林永鑫
- 学号:201821121040
- 班级:计算1812
1. 编写程序
在服务器上用Vim编写程序:创建一个命名管道,创建两个进程分别对管道进行读fifo_read.c
和写fifo_write.c
。
fifo_read.c
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/types.h> 4 #include<string.h> 5 #include<stdlib.h> 6 #include<sys/stat.h> 7 #include<errno.h> 8 #include<fcntl.h> 9 int main(){ 10 int mk = mkfifo("fifo",0777); 11 if((mk<0)&&(errno!=EEXIST)) 12 { 13 printf("Open fifo error! "); 14 exit(1); 15 } 16 else{ 17 printf("Open fifo success! "); 18 } 19 //打开管道文件 20 int fd = open("fifo",O_RDONLY); 21 if(fd==-1){ 22 printf("Open fifo fail! "); 23 exit(1); 24 } 25 char readbuffer[1000]; 26 //从管道中读取 27 while(1){ 28 int fr = read(fd,readbuffer,1000); 29 if(fr >0 ) 30 printf("Read:%s ",readbuffer); 31 32 } 33 close(fd); 34 exit(0); 35 }
fifo_write.c
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/types.h> 4 #include<string.h> 5 #include<stdlib.h> 6 #include<sys/stat.h> 7 #include<errno.h> 8 #include<fcntl.h> 9 int main(){ 10 char readbuffer[1000]; 11 int fd = open("fifo",O_WRONLY); 12 if(fd == -1){ 13 printf("Open fifo fail! "); 14 exit(1); 15 } 16 else{ 17 printf("Open fifo success! "); 18 } 19 //从管道中读取 20 while(1){ 21 scanf("%s",readbuffer); 22 int fw =write(fd,readbuffer,(strlen(readbuffer)+1)); 23 printf("Write:%s ",readbuffer); 24 } 25 close(fd); 26 exit(0);
2. 分析运行结果
运行结果:
write端:
read端:
分析:在运行的时候要同时打开两个终端,一个终端运行fifo_write.c,另一个终端运行fifo_read.c
当两个终端都打开的时候管道就成功了,在运行fifo_write.c终端输入成功的同时运行fifo_read.c则显示输入的信息。
创建命名管道
int mkfifo(const char *filename, mode_t mode);
mode:
O_RDONLY:读管道
O_WRONLY:写管道
O_RDWR:读写管道
O_NONBLOCK:非阻塞
3. 通过该实验产生新的疑问及解答
通过该实验如果有产生新的疑问,可以写出来,并尝试自己解决问题。
当成功运行的时候,在write端一直按回车发现程序一直运行,那么怎么停止呢?
通过网上查询,发现简单的Ctrl+c就可以结束程序的运行
参考:https://blog.csdn.net/guyue35/article/details/53419373