• 操作系统第3次实验报告:管道


    • 姓名:林永鑫
    • 学号: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

  • 相关阅读:
    海量数据拆分到nosql系统的一种方案
    软件架构师应该知道的97件事
    【转载】实现软件架构质量属性的战术
    让技术人员看得懂的流程
    【转载】一步步构建大型网站架构
    [转载]从100PV到1亿级PV网站架构演变
    添加和删除hadoop集群中的节点
    windows下JDK环境配置
    如何部署hadoop集群
    android9.0适配HTTPS:not permitted by network security policy'
  • 原文地址:https://www.cnblogs.com/lyxsg/p/12721128.html
Copyright © 2020-2023  润新知