14-2-进程间通信-FIFO

news2024/11/14 0:28:43

一、命名管道FIFO

 1.作用范围

对于命名管道FIFO,它可以在不相关的进程间也能相互通信。

 2.命名管道可左右用于不相关进程的原因

因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。

 

 3.命名管道的注意点:阻塞与非阻塞

使用open函数打开fifo时,第二个参数有一个非阻塞标志(O_NONBLOCK),有以下几种情况需要注意:
1、不指定O_NONBLOCK时:
① open以只读方式打开FIFO时,要阻塞到某个其他进程为“写”而打开此FIFO,open才解除阻塞。
②open以只写方式打开FIFO时,要阻塞到某个其他进程为“读”而打开此FIFO,open才解除阻塞。
③open以只读、只写方式打开FIFO时会阻塞,调用read函数从FIFO里读数据时read也会阻塞。
④调用write函数向FIFO里写数据,当缓冲区已满时write也会阻塞。

2、指定O_NONBLOCK时
①以只读方式(O_RDONLY | O_NONBLOCK)打开fifo,即便没有"写"进程启动,open也不会阻塞。
②以只写方式(O_WRONLY | O_NONBLOCK)打开fifo,如果没有‘’读”进程启动,open会出错:open: No such device or address。
③read、write读写管道中的数据时不会阻塞。

4.实验验证FIFO的功能和特性

(1)使用的API

创建命名管道:mkfifo(管道名称,权限);
例如:mkfifo("./file",0600);//创建1个名为file的命名管道,其权限为0600;

(2)验证以只读方式打开fifo时(不指定O_NONBLOCK时),open是否会阻塞;

如图,

程序逻辑:

“创建好fifo后,以只读方式打开该fifo(不指定O_NONBLOCK时),打开该fifo后会屏幕输出“open success”;”

程序运行结果:
程序被阻塞了,说明以只读方式打开该fifo,open被阻塞了。

 (3)验证“open以只读方式打开FIFO时,要阻塞到某个其他进程为“写”而打开此FIFO,open才解除阻塞。”

如图,编辑了write.c,该c文件的目的是:以“只写”的方式打开名为file的fifo;

程序运行结果:

先运行fiforun(以只读的方式打开fifo,但是open被阻塞了);

接着运行write(以“只写”的方式打开fifo,此时fiforun中的open被解除阻塞);

然后才打印"other process had open fifo"和“open success”

(4)通过fifo实现数据传输

实验目的:创建fifo(不指定O_NONBLOCK);-->fifio.c以只读方式打开fifo(阻塞)--->write.cc中另一个进程以只写的方式打开fifo,解除fifio.c中的open的阻塞状态----->write.c中的进程向fifo写入数据---->fifio.c中利用read从fifo中读取数据;

myfifo.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
        char buffer[30] = {0};
        if((mkfifo("./file",0600) == -1) && errno != EEXIST)
        {
                printf("mkfifo failed\n");
                perror("why");
        }

        int fd = open("./file",O_RDONLY);
        printf("open success\n");

        int nread = read(fd,buffer,30);
        printf("nread = %d,read_buffer:%s",nread,buffer);
        close(fd);
        return 0;
}

 write.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
int main()
{
        char buffer_write[30] = {0};
        int fd = open("./file",O_WRONLY);
        printf("other process had open fifo\n");
        printf("please input data to fifo\n");
        scanf("%s",buffer_write);
        write(fd,buffer_write,strlen(buffer_write));
        close(fd);
        return 0;
}
~        

 运行结果:成功实现基于fifo的数据传输

 (5)通过fifo实现数据的持续收发

实验目的:一个进程从fifo读数据(在死循环里读),1个进程向fifo写数据(在死循环里写,每1秒写1次);

myfifo.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
        char buffer[30] = {0};
        if((mkfifo("./file",0600) == -1) && errno != EEXIST)
        {
                printf("mkfifo failed\n");
                perror("why");
        }

        int fd = open("./file",O_RDONLY);
        printf("open success\n");

        int nread;
        while(1)
        {
                nread = read(fd,buffer,30);
                printf("nread = %d,read_buffer:%s",nread,buffer);
                nread = 0;
                memset(buffer,0,sizeof(buffer));
        }

        close(fd);
        return 0;
}
  

write.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
int main()
{
        char buffer_write[30] = "hello\n";
        int fd = open("./file",O_WRONLY);
        printf("other process had open fifo\n");
        printf("please input data to fifo\n");
        while(1)
        {
                write(fd,buffer_write,strlen(buffer_write));
                sleep(1);
        }
        close(fd);
        return 0;
}

 运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14-1-进程间通信-pipe

一.无名管道pipe 特点&#xff1a; (1)半双工&#xff08;在同一时刻&#xff0c;数据传输的方向只能是接收或发送&#xff09;&#xff1b; 例如&#xff1a;对于主机和从机而言&#xff0c;在某一时刻&#xff0c;只能是主机发送&#xff08;从机接收&#xff09;&#xff0…

CentOS+nginx手动搭建WordPress

文章目录 前提条件php安装安装 EPEL 源及源管理工具&#xff1a;安装 REMI 源&#xff1a;安装 PHP7.3 及扩展&#xff1a;设置开机自动启动其他php命令 wordpress 安装下载WordPress将下载的WordPress移动至网站根目录修改WordPress配置文件配置nginx 创建完成后根据域名访问 …

分析linux中动态库so文件的常用方法

前言 在linux系统中&#xff0c;我们经常会遇到各种各样的动态库文件&#xff0c;常见的是.so后缀&#xff0c;那么我们应该如何分析这些文件的用途和作用呢&#xff1f;毕竟我们不能一知半解的“搞事情”。 正文 查看文件属性 首先&#xff0c;我们从整体上了解一下该文件的基…

maven-gpg-plugin gpg禁用交互式输入密码 免密码输入 设置默认密码 关闭pinentry-qt输入 passphrase

一、问题描述 在使用maven-gpg-plugin打包jar时,默认情况下&#xff0c;每次都会弹出对话框要你输入密码&#xff1a; 这就有点烦&#xff0c;有啥办法可以设置默认方法没&#xff1f;网上找了一圈&#xff0c;通过搜索关键词“passphrase”&#xff0c;找到了一些教程&#x…

无损以太网与网络拥塞管理(PFC、ECN)

无损以太网 无损以太网&#xff08;Lossless Ethernet&#xff09;是一种专门用于数据中心网络的网络技术&#xff0c;旨在提供低延迟、高吞吐量和可靠性的传输服务。它是在传统以太网的基础上进行了扩展&#xff0c;引入了新的拥塞管理机制&#xff0c;以避免数据包丢失和网络…

探索【Stable-Diffusion WEBUI】的插件:ControlNet 1.1

文章目录 &#xff08;零&#xff09;前言&#xff08;二&#xff09;ControlNet&#xff08;v1.1&#xff09;&#xff08;2.1&#xff09;模型&#xff08;2.2&#xff09;新版界面&#xff08;2.3&#xff09;预处理器 &#xff08;三&#xff09;偷懒 &#xff08;零&#…

机器学习与深度学习——通过决策树算法分类鸢尾花数据集iris求出错误率画出决策树并进行可视化

什么是决策树&#xff1f; 决策树是一种常用的机器学习算法&#xff0c;它可以对数据集进行分类或回归分析。决策树的结构类似于一棵树&#xff0c;由节点和边组成。每个节点代表一个特征或属性&#xff0c;每个边代表一个判断或决策。从根节点开始&#xff0c;根据特征的不同…

list的使用介绍---C++

一、list简介 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。…

计算机网络第一章(谢希仁第8版学习)

作者&#xff1a;爱塔居 专栏&#xff1a;计算机网络 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起加油 文章目录 目录 文章目录 一、网络、互连网、互联网&#xff08;因特网&#xff09;的概念 二、因特网的组成 三、交换方式 3.1 电路交换 3.2 分组交换 3.3 电路…

详解c++---list介绍

目录标题 list介绍list定义list遍历list数据插入push_backpush_frontinsert list删除pop_backpop_fronterase list排序list去重list合并list转移list其他函数emptysizefrontbackassignswapresizeclear list排序效率问题 list介绍 list是可以在常数范围内在任意位置进行插入和删…

【Java笔试强训 22】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;小易的升…

【Java笔试强训 21】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525; 洗牌 &…

免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

java+jsp企业物流货运快递管理系统servlet

功能需求具体描述&#xff1a; (1)用户功能模块包括用户登录注册&#xff0c;用户信息的修改&#xff0c;用户发布货物信息&#xff0c;给客服人员留言&#xff0c;对运输公司进行评价。 (2)企业功能模块包括企业注册登录&#xff0c;企业信息的修改&#xff0c;受理用户发布的…

c#笔记-代码格式

格式 为了让编译器能看懂。我们编写的源码必须符合一定的规范。 区分大小写 c#是大小写敏感语言。A1和a1是不同的东西。 不区分空白字符 c#对空白字符&#xff08;空格&#xff0c;制表符&#xff0c;换行&#xff09;不敏感。只要不截断单词&#xff0c;可以任意地使用空…

Java 基础进阶篇(二)—— 面向对象的三大特征之二:继承

文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后&#xff1a;成员变量和方法的访问特点五、继承后&#xff1a;方法重写六、继承后&#xff1a;子类构造器的特点七、继承后&#xff1a;子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…

TiDB实战篇-TiDB集群常用的监控指标

TiDB Server相关指标 Duration(延迟) 总体延迟 SQL不同的类型延迟 不同实例延迟 QPS&#xff08;每秒钟查询次数&#xff09; 总览 CPS&#xff08;一次请求多个sql,上面的QPS每一次就是一个记录&#xff09; 事务相关 延迟 影响性能的大事务 CPU 内存&#xff08;下图…

面试官:谈谈你对死锁的理解

1. 什么是死锁 比如上一次讲到 synchronized 的时候&#xff0c;一个线程&#xff0c;对同一个对象连续加锁两次&#xff0c;如果出现阻塞等待&#xff0c;代表这个锁是不可重入锁&#xff0c;这样的线程&#xff0c;也就称为死锁&#xff01; 一旦程序进入死锁了就会导致线程僵…

PromQL,让你轻松实现监控可视化!快来了解一下吧!

Prometheus 中的一些关键设计&#xff0c;比如注重标准和生态、监控目标动态发现机制、PromQL等。 PromQL 是 Prometheus 的查询语言&#xff0c;使用灵活方便&#xff0c;但很多人不知道如何更好利用它&#xff0c;发挥不出优势。 PromQL主要用于时序数据的查询和二次计算场…

【Docker】4、Docker 数据卷

目录 一、数据卷介绍二、数据卷相关命令三、创建一个数据卷&#xff0c;并查看数据卷在宿主机的目录位置四、数据卷挂载到容器五、数据卷挂载练习&#xff08;MySQL&#xff09;(1) 加载 MySQL 镜像(2) 根据镜像创建容器 一、数据卷介绍 &#x1f384; 数据卷&#xff08;volum…