操作系统第3次实验报告:管道
- 姓名:林顺达
- 学号:201821121022
- 班级:计算1811
1. 编写程序
在服务器上用Vim编写程序:创建一个命名管道,创建两个进程分别对管道进行读fifo_read.c
和写fifo_write.c
。给出源代码:
fifo_read.c:
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<unistd.h> #include<string.h> #include<fcntl.h> #include<signal.h> int main(){ int fr = open("mkfifo",O_RDONLY); assert(fr != -1); printf("两端建立连接!!!\n"); while(1) { char BuffRead[1000]={0}; int n = read(fr,BuffRead,1000); if(n==0){ printf("对方已关闭\n"); break; } printf("read(读到文字长度=%d):%s",n,BuffRead); } close(fr); exit(0); }
fifo_write.c:
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<unistd.h> #include<string.h> #include<fcntl.h> #include<signal.h> int main(){ int fw = open("mkfifo",O_WRONLY); assert(fw != -1); printf("两端建立连接!!!\n"); while(1){ char BuffWrite[1000]={0}; fgets(BuffWrite,1000,stdin); if(strncmp(BuffWrite,"end",3)==0){ break; } write(fw,BuffWrite,strlen(BuffWrite)); } close(fw); exit(0); }
2. 分析运行结果
运行演示结果:
分析:
- 左边为读端,右边为写端
- 当一端开始运行,不会马上触发“两端建立连接”,只有当两端同时运行时才会触发
- 写端使用'stdin'读取键盘输入,通过'fgets'写入管道
- 读端使用'read'读取管道中的文字,并将其打印在屏幕上
- 由于读端从管道中读取文字后,文字带有结束符,故'读到文字长度'会比实际写入文字长度多一
- 写端每次输入判断是否为字符串“end“,假如是则”break“出循环,反之继续写入管道
- 当写端停止写入管道时,读端”read“会返回”0“,此时检测到写端关闭,读端也关闭,结束整个管道读写
3. 通过该实验产生新的疑问及解答
疑问:假如开启写端,并且写入若干文字后,在开启读端,前面写入的文字会显示出来吗
解答:通过实践,得到以下效果
分析:从写端写入四次,文字分别为(a,b,c,d),而写端仅显示一次写入并且文字长度为8(4个字符+3个换行+1个结束符)
得知:当读端开启后,读端会打印出之前写端写入的所有文字,并且将其当作一次输入