一、实验目的

1、了解有名管道通信的原理。

2、掌握有名管道的创建及使用方法。

二、实验内容

1、分别在磁盘文件test1和test2中输入多行字符串。接着使用mkfifo函数创建有名管道,以阻塞方式打开管道,通过对管道进行读、写,将磁盘文件test1和test2中的内容按顺序复制到目标文件test3中,即在源文件test1、test2与目标文件test3之间完成内容顺序拷贝。 

2、编译程序,并分别在两个终端里运行读端和写端程序,查看结果。

三、实验具体分工

组内人员分别独立完成实验

四、实验步骤、源程序及结果截图

1.新建立两个文件分别是test1和test2,并分别在两个文件中输入内容:

  1. 创建空白文本test3
  2. 使用mkfifo函数创建有名管道,以阻塞方式打开管道,通过对管道进行读、写,将磁盘文件test1和test2中的内容按顺序复制到目标文件test3中.
  3. 编写大读操作代码和写操作代码:

源代码:

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;

}
  1. 将源文件编译后执行
  2. 运行结果如下:

首先运行./reader 读取内容后再执行./writer将读取到的内容写到test3中。

五、实验问题总结

        做实验时首先要确保创建有名管道,将含有内容的文本读取到管道中,然后写入第三个空白文本中。创建有名管道需要使用mkfifo命令或者mkfifo()系统调用。一旦有名管道被创建,就可以像操作普通文件一样对其进行读写。所以管道的权限的设置一定要可读写,否则是不行的。0666表示所有用户都具有读取和写入管道的权限。具体来说,0表示八进制数,第一位表示特殊权限,后三位表示所有者权限,中间三位表示组权限,最后三位表示其他用户权限。每个权限位可以是0(无权限)到7(完全权限)之间的数字。

        一个进程可以将数据写入有名管道,而另一个进程则可以从该管道中读取数据。读写操作可以使用标准的文件I/O函数(如open、read、write和close)来完成。在默认情况下,读写有名管道的操作是阻塞的,即如果没有数据可读或管道已满,则读写操作会一直等待。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐