请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

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

[复制链接]
查看: 24|回复: 0

2万

主题

2万

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
75467
发表于 2020-9-17 04:00 | 显示全部楼层 |阅读模式

  • 姓名 :万大明
  • 学号 :201821121058
  • 班级 :计算1812
1. 编写程序

fifo_write.c
  1. #include                                                #include                                               #include                                                #include                                               #include                                                #include                                               #include                                               #include                                            #include                                            int main(){                                                          int fifo=mkfifo("fifo",0662);                                   if((fifo == -1)){                                                    if((errno!=EEXIST)){          //排除文件已存在这个报错                                       perror("mkfifo");         //依参数fifo建立特殊的FIFO文件                                       exit(-1);                                                    }                                                            }                                                                char buffer[500];                                                int fd = open("fifo",O_WRONLY); //打开管道文件fifo               if(fd == -1){                                                        printf("Open failure\n");  //打开管道文件失败                    exit(-1);                                                    }                                                                while(1){                                                            printf("Please write content : ");                               scanf("%s",buffer);     //用户输入                                             int fkwrite=write(fd,buffer,(strlen(buffer)+1));     //将用户输入的值写入管道            printf("Successful!");                  }                                                                close(fd);                                                       return 0;                                                    }  
复制代码
fifo_read.c
  1. #include                                                                   #include                                                                 #include                                                                   #include                                                                  #include                                                                   #include                                                                  #include                                                                  #include                                                               #include                                                               int main(){                                                                             int fifo=mkfifo("fifo",0662);                                                       if((fifo == -1)){                                                                       if((errno!=EEXIST)){               //排除文件已存在这个报错                                                     perror("mkfifo");                                                                   exit(-1);                                                                       }                                                                               }                                                                                   char buffer[500];                                                                   int fd=open("fifo",O_RDONLY);          //以读的方式打开管道                                             if(fd == -1){                                                                           printf("Error!\n");                                                                 exit(-1);                                                                      }                                                                                   while(1){                                                                               if(read(fd,buffer,500) > 0)                                                             printf("Successfully read : %s\n",buffer);    //读出写入的内容                              }                                                                                   return 0;                                                                                                                                                          }  
复制代码

2. 分析运行结果

执行"./fifo_write"的结果:
我的关键词 操作系统第3次实验报告:管道  新闻咨询 1785926-20200418104003381-1430043385


执行"./fifo_read"的结果:
我的关键词 操作系统第3次实验报告:管道  新闻咨询 1785926-20200418033426464-26623968


分析:

  • 工作特点为:单向(write->read),先进先出,同步进行
  • O_RDONLY:读管道
         O_WRONLY:写管道

  • 在进行以上操作时,应打开两个端口,先将读的一端打开,再打开
         写的一端,否则读端将会堵塞。

  • 由写入端写入内容,写入成功会提示"successful",由读出端读出。
3. 通过该实验产生新的疑问及解答


  • 疑惑:O_RDONLY, O_WRONLY, O_RDWR等有什么作用,什么情况下堵塞或不堵塞。
          解答:调用open打开有名管道的进程可能会被阻塞。但如果同时用读写方式(O_RDWR)打
                  开,则一定不会导致阻塞;如果以只读方式(O_RDONLY)打开,则调用open函数的
                  进程将会被阻塞直到有写方式打开管道;同样以写方式(O_WRONLY)打开也会阻塞
                  直到有读方式打开管道。

  • 疑惑:当读出端不打开时,写入端输入后一直无反应。
                                          
我的关键词 操作系统第3次实验报告:管道  新闻咨询 1785926-20200418111159975-1891141435

          解答:管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管
                    道缓冲区中的数据,那么写操作将一直被阻塞等待。
4. 加分项

利用管道编程解决一些实际的问题。

  • QQ?    实时通信?

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表