操作系统第三次实验报告:管道
- 姓名:朱笃信
- 学号: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后的内容到了下一行,通过在代码中查找换行符并将其替换可以有效解决该问题。