操作系统第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则依然存在。进而发现管道只能进行单方向通信并且提供了管道内部同步机制。

浙公网安备 33010602011771号