Linux嵌入式操作系统-实验四 进程间通信——有名管道

一、实验目的

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)来完成。在默认情况下,读写有名管道的操作是阻塞的,即如果没有数据可读或管道已满,则读写操作会一直等待。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值