一、实验目的
1、了解有名管道通信的原理。
2、掌握有名管道的创建及使用方法。
二、实验内容
1、分别在磁盘文件test1和test2中输入多行字符串。接着使用mkfifo函数创建有名管道,以阻塞方式打开管道,通过对管道进行读、写,将磁盘文件test1和test2中的内容按顺序复制到目标文件test3中,即在源文件test1、test2与目标文件test3之间完成内容顺序拷贝。
2、编译程序,并分别在两个终端里运行读端和写端程序,查看结果。
三、实验具体分工
组内人员分别独立完成实验
四、实验步骤、源程序及结果截图
1.新建立两个文件分别是test1和test2,并分别在两个文件中输入内容:
- 创建空白文本test3
- 使用mkfifo函数创建有名管道,以阻塞方式打开管道,通过对管道进行读、写,将磁盘文件test1和test2中的内容按顺序复制到目标文件test3中.
- 编写大读操作代码和写操作代码:
源代码:
Reader.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int main() {
int fd;
char buffer[BUFFER_SIZE];
ssize_t bytesRead;
// 打开管道
fd = open("myfifo", O_RDONLY);
// 创建目标文件test3
int fd3 = open("test3", O_WRONLY | O_CREAT | O_TRUNC, 0666);
// 从管道中读取内容并写入test3
while ((bytesRead = read(fd, buffer, BUFFER_SIZE)) > 0) {
write(fd3, buffer, bytesRead);
}
// 关闭文件描述符
close(fd);
close(fd3);
return 0;
}
Writer.c:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int main() {
int fd1, fd2, fd3;
char buffer[BUFFER_SIZE];
ssize_t bytesRead;
// 打开磁盘文件test1和test2
fd1 = open("test1", O_RDONLY);
//只读模式打开
fd2 = open("test2", O_RDONLY);
// 创建有名管道
mkfifo("myfifo", 0666);
/*0666表示所有用户都具有读取和写入管道的权限。具体来说,0表示八进制数,
第一位表示特殊权限,后三位表示所有者权限,中间三位表示组权限,最后三位表示其他用户权限。每个权限位可以是0(无权限)到7(完全权限)之间的数字。*/
// 打开管道 写
fd3 = open("myfifo", O_WRONLY);
// 从test1中读取内容并写入管道
while ((bytesRead = read(fd1, buffer, BUFFER_SIZE)) > 0) {
write(fd3, buffer, bytesRead);
}
// 从test2中读取内容并写入管道
while ((bytesRead = read(fd2, buffer, BUFFER_SIZE)) > 0) {
write(fd3, buffer, bytesRead);
}
//buffer代表缓冲区
// 关闭文件描述符
close(fd1);
close(fd2);
close(fd3);
return 0;
}
- 将源文件编译后执行
- 运行结果如下:
首先运行./reader 读取内容后再执行./writer将读取到的内容写到test3中。
五、实验问题总结
做实验时首先要确保创建有名管道,将含有内容的文本读取到管道中,然后写入第三个空白文本中。创建有名管道需要使用mkfifo命令或者mkfifo()系统调用。一旦有名管道被创建,就可以像操作普通文件一样对其进行读写。所以管道的权限的设置一定要可读写,否则是不行的。0666表示所有用户都具有读取和写入管道的权限。具体来说,0表示八进制数,第一位表示特殊权限,后三位表示所有者权限,中间三位表示组权限,最后三位表示其他用户权限。每个权限位可以是0(无权限)到7(完全权限)之间的数字。
一个进程可以将数据写入有名管道,而另一个进程则可以从该管道中读取数据。读写操作可以使用标准的文件I/O函数(如open、read、write和close)来完成。在默认情况下,读写有名管道的操作是阻塞的,即如果没有数据可读或管道已满,则读写操作会一直等待。