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

  • 姓名:朱笃信
  • 学号:201821121021
  • 班级:计算1811

1. 编写程序

 1.管道命名(由于后面的读写都指定管道名称,所以此处的创建过程也采用程序中指定的方式。)
  1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<sys/stat.h>
  4 int main(){
  5     int temp=mkfifo("fifo",0777);  //创建管道fifo
  6     if(temp==-1){      //执行成功返回0,失败返回-1
  7         perror("defeat");
  8         return -1;
  9     }
 10     return 0;
 11 }

 

由于int mkfifo(const char *pathname, mode_t mode);中的参数mode是指管道文件权限,所以我将权限内容进行简单整理,以下为各权限所代表内容:

 权限  说明  权限  说明
 r--  只读  -w-  仅可写
 --x 仅可执行   rw-  可读可写
 -wx  可写可执行  r-x  可读可执行
 rwx  可读可写可执行  ---  无权限

 并且 对于这些权限通常采用八进制表示:(亦可采用二进制,具体二进制自行转化)

权限 八进制
--- 0
x 1
w 2
wx 3
r 4
rx 5
rw 6
rwx 7

由于此处是实验,所以mode选择777,方便实验进行。

并且创建有名管道可以直接使用命令mkfifo name进行创建。

2.fifo_read.c
  1 #include<unistd.h>
  2 #include<stdlib.h>
  3 #include<errno.h>
  4 #include<string.h>
  5 #include<fcntl.h>
  6 #include<stdio.h>
  7 
  8 int main(){
  9     int fifo_read=open("fifo",O_RDONLY);
 10     if(fifo_read==-1){
 11         perror("open");
 12         return -1;
 13     }
 14
 15     while(1){
 16         char buffer[128]={0};
 17         int flag=read(fifo_read,buffer,128);
 18         if(flag==0){
 19             printf("it is closed");
 20             break;
 21         }
 22         printf("read:%s from fifo\n",buffer);
 23     }
 24
 25     close(fifo_read);
 26     return 0;
 27 }

 

3.fifo_write.c
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<signal.h>
  4 #include<unistd.h>
  5 #include<string.h>
  6 #include<fcntl.h>
  7 
  8 int main(){
  9     int fifo_write=open("fifo",O_WRONLY);
 10     if(fifo_write==-1){
 11         perror("open");
 12         return -1;
 13     }
 14
 15     while(1){
 16         char buffer[128]={0};
 17         char* find;
 18         fgets(buffer,128,stdin);
 19         find=strchr(buffer,'\n');
 20         if(find){
 21             *find='\0';
 22         }
 23         if(strcmp(buffer,"end")==0){
 24             break;
 25         }
 26         write(fifo_write,buffer,strlen(buffer));
 27     }
 28     close(fifo_write);
 29     return 0;
 30 }

 

2. 分析运行结果

 fifo_write写入:

 

 fifo_read读取:

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

 在初次进行试验时发现read方收到信息,但是显示结果不能整行输出,会出现收到信息后的内容无法显示的情况,并且在下一次收到消息才会显示:

write:

read:

 

 分析代码,发现问题出在fgets()读取输入内容时会将换行符一同写入,这样就造成了上图中hello后面不显示,并且原hello后的内容到了下一行,通过在代码中查找换行符并将其替换可以有效解决该问题。

 

posted @ 2020-04-16 22:44  duxinZhu  阅读(189)  评论(0编辑  收藏  举报