操作系统第3次实验报告:管道
姓名:张皓落
学号:201821121005
班级:计算1811
一、实验目的
掌握进程间通信管道的编程。
二、实验内容
- 在服务器上用VIM编写一个程序:创建一个命名管道,创建两个进程分别对管道进行读
fifo_read.c
和写fifo_write.c
。给出源代码 - 给出运行结果,并分析
三、实验报告
1. 编写程序
write.c:
1 #include<stdio.h>
2 #include<string.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5 #include<sys/stat.h>
6 #include<fcntl.h>
7
8 int main(int argc,char *argv[])
9 {
10 int fd;
11 int ret;
12 ret=mkfifo("my_fifo",0666);
13 if(ret!=0)
14 {
15 perror("mkfifo");
16 }
17 fd=open("my_fifo",O_WRONLY);
18 if(fd<0)
19 {
20 perror("open fifo");
21 }
22 while(1)
23 {
24 char send[500];
25 scanf("%s",send);
26 write(fd,send,strlen(send));
27 printf("write:%s\n",send);
28 }
29
30 close(fd);
31 return 0;
32 }
read.c:
1 #include<stdio.h>
2 #include<string.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5 #include<sys/stat.h>
6 #include<fcntl.h>
7
8 int main(int argc,char *argv[])
9 {
10 int fd;
11 int ret;
12 ret=mkfifo("my_fifo",0666);
13 if(ret!=0)
14 {
15 perror("mkfifo");
16 }
17 fd=open("my_fifo",O_RDONLY);
18 if(fd<0)
19 {
20 perror("open fifo");
21 }
22 while(1)
23 {
24 char recv[100]={0};
25 read(fd,recv,sizeof(recv));
26 printf("%s\n",recv);
27 sleep(1);
28 }
29 close(fd);
30 return 0;
31 }
2. 分析运行结果
写入端说明:
首先在程序中判断是否成功建立实名管道,并输出结果提示,然后再输入内容,并在该端立即换行输出输入的内容。
读出端说明:
首先也将判断是否成功建立实名管道,然后在根据写入端的实时输入,输入相应的内容
3. 通过该实验产生新的疑问及解答
(1)open调用的阻塞与非阻塞针对于open中只读和和只写模式下的不同之处
只读方式(O_RDONLY):如果open调用是阻塞的,除非有一个进程以写方式打开同一个FIFO,否则它不会返回;
如果open调用是非阻塞的的(O_NONBLOCK),则即使没有其他进程以写方式打开同一个FIFO文件,open调用将成功并立即返回。
只写方式(O_WRONLY):如果open调用是阻塞的,open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;
如果open调用是非阻塞的(O_NONBLOCK),open总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open调用将返回-1,并且FIFO也不会被打开。
(2)如果多个进程打开写端和读端那一个写端输入的信息会在多个读端输出吗?
通过在打开两个读端和两个写端发现,两个写端的写入只能在第一个打开的读端才能读出而第二格读端则没有读出的内容。
运行结果如下: