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

  • 姓名:杨富宏
  • 学号:201821121017
  • 班级:计算1811

1. 编写程序

创建管道pipe.c:

  1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<sys/stat.h>
  4 int main(){
  5         int pip=mkfifo("fifo",0777);
  6         if(pip==-1){
  7         perror("connect error");
  8         return -1;
  9     }
 10     return 0;
 11 }

 

创建: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 while(1){
 15     char buffer[100]={0};
 16     char* ch;
 17     fgets(buffer,100,stdin);
 18     ch=strchr(buffer,'\n');
 19     if(ch){
 20          *ch='\0';
 21     }
 22     if(strcmp(buffer,"end")==0){
 23         break;
 24     }
 25      write(fifo_write,buffer,strlen(buffer));
 26 }
 27  close(fifo_write);
 28  return 0;
 29  }

 

创建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         return -1;
 12     }
 13     while(1){
 14         char buffer[100]={0};
 15         int f=read(fifo_read,buffer,100);
 16         if(f==0){
 17             printf("关闭!");
 18             break;
 19         }
 20         printf("读取管道中的数据:%s\n",buffer);
 21     }
 22     close(fifo_read);
 23     return 0;
 24}

 

2. 分析运行结果

fifo_write.c

 

fifo_read.c: 

 

 

分析:

同时开启两个程序,并且让上面三个程序同时运行起来,然后从左边的write写入一些信息,read端能够同步输出信息。

管道也类似于队列,都是先进先出,且具有同步性。

通过查询命名管道创建的系统函数有如下两个:(这里我们用了第二种方法)

int mknod(const char *path,mode_t mod,dev_t dev);
int mkfifo(const char *path,mode_t mode);

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

  如果关闭一个端口,另外一端会不会同时自动断开?

  从write进行关闭,则read端也会自动断开;但是如过先关闭read,write则依然存在。进而发现管道只能进行单方向通信并且提供了管道内部同步机制。 

 

posted @ 2020-04-17 00:53  waiting!  阅读(203)  评论(0)    收藏  举报