- 姓名:肖斯凯
- 学号:201821121015
- 班级:计算1811
1. 编写程序
在服务器上用Vim编写程序:创建一个命名管道,创建两个进程分别对管道进行读fifo_read.c
和写fifo_write.c
。给出源代码。
fifo_write.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <sys/stat.h> 5 #include <sys/types.h> 6 #include <fcntl.h> 7 #include <unistd.h> 8 int main(){ 9 int f=open("fifo",O_WRONLY); 10 if(f<0){ 11 printf("failure\n"); 12 return -1; 13 } 14 while(1){ 15 char c[20]; 16 printf("the other side is reading."); 17 fflush(stdout); 18 ssize_t size=read(0,c,sizeof(c)-1); 19 if(c[0]=='0'){ 20 printf("exit successful\n"); 21 write(f,c,strlen(c)); 22 break; 23 }else{ 24 c[size]=0; 25 write(f,c,strlen(c)); 26 } 27 } 28 close(f); 29 return 0; 30 }
fifo_read.c
1 #include <stdio.h> 2 #include<errno.h> 3 #include <sys/stat.h> 4 #include <sys/types.h> 5 #include <stdlib.h> 6 #include <fcntl.h> 7 #include <unistd.h> 8 int main(){ 9 unlink("fifo"); 10 if(mkfifo("fifo",0777)==-1){ 11 if(errno==EEXIST) 12 printf("this exist\n"); 13 else{ 14 printf("failure\n"); 15 return -1; 16 } 17 } 18 int f=open("fifo",O_RDONLY); 19 if(f<0){ 20 printf("fail!\n"); 21 return -1; 22 } 23 char c[20]; 24 while(1){ 25 printf("the other side is writing.\n"); 26 ssize_t size=read(f,c,sizeof(c)-1); 27 if(size<0){ 28 printf("error!\n"); 29 break; 30 }else if(size>0){ 31 if(c[0]=='0') 32 break; 33 else{ 34 c[size]=0; 35 printf("the content is:%s",c); 36 } 37 } 38 } 39 close(f); 40 return 0; 41 }
2. 分析运行结果
打开两个终端运行程序之后,write方输入,read方即可读到并输出,当write写入0时,信息还是会传过去,然后write方退出程序,read方收到判断出字符为0时也自动退出程序,且不输出信息
3. 通过该实验产生新的疑问及解答
read函数的作用是什么:
例如:
read(f,c,a)
read()会把参数f 所指的文件传送a个字节到c指针所指的内存中。