操作系统第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个结束符)

得知:当读端开启后,读端会打印出之前写端写入的所有文字,并且将其当作一次输入

posted @ 2020-04-16 21:07  丶Lin  阅读(282)  评论(0编辑  收藏  举报