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

时间:2024-01-26 19:14:35

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

  • 姓名 :万大明
  • 学号 :201821121058
  • 班级 :计算1812

1. 编写程序

fifo_write.c

#include <fcntl.h>                                               
#include <unistd.h>                                              
#include <stdio.h>                                               
#include <stdlib.h>                                              
#include <errno.h>                                               
#include <signal.h>                                              
#include <string.h>                                              
#include <sys/types.h>                                           
#include <sys/stat.h>                                           
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("Successfully write : %s\n",buffer);             
     }                                                           
     close(fd);                                                  
     return 0;                                                   
 }  

 fifo_read.c

#include <fcntl.h>                                                                  
#include <unistd.h>                                                                
#include <stdio.h>                                                                  
#include <stdlib.h>                                                                 
#include <errno.h>                                                                  
#include <signal.h>                                                                 
#include <string.h>                                                                 
#include <sys/types.h>                                                              
#include <sys/stat.h>                                                              
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"的结果

 

 执行"./fifo_read"的结果:

 

分析:

  • 工作特点为:单向(write->read),先进先出,同步进行
  • O_RDONLY:读管道
         O_WRONLY:写管道
  • 在进行以上操作时,应打开两个端口,先将读的一端打开,再打开

         写的一端,否则读端将会堵塞。

  • 由写入端写入内容,写入成功会提示"successful",由读出端读出。

3. 通过该实验产生新的疑问及解答

  • 疑惑:O_RDONLY, O_WRONLY, O_RDWR等有什么作用,什么情况下堵塞或不堵塞。

          解答:调用open打开有名管道的进程可能会被阻塞。但如果同时用读写方式(O_RDWR)打

                  开,则一定不会导致阻塞;如果以只读方式(O_RDONLY)打开,则调用open函数的

                  进程将会被阻塞直到有写方式打开管道;同样以写方式(O_WRONLY)打开也会阻塞

                  直到有读方式打开管道。

  • 疑惑:当读出端不打开时,写入端输入后一直无反应。

                                         

          解答:管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管

                    道缓冲区中的数据,那么写操作将一直被阻塞等待。

4. 加分项

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

  • QQ?    实时通信?