zoukankan      html  css  js  c++  java
  • 操作系统第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

  • 相关阅读:
    [SQL Basics] Indexes
    [DS Basics] Data structures
    [Algorithm Basics] Search
    [Algorithm Basics] Sorting, LinkedList
    [Java Basics] multi-threading
    [Java Basics] Reflection
    [Java Basics] Collection
    SSH basics
    纯css实现三角形
    2015年百度实习生前端笔试题上海卷a
  • 原文地址:https://www.cnblogs.com/lyxsg/p/12721128.html
Copyright © 2011-2022 走看看