当前位置: 首页 > 编程日记 > 正文

linux进程间通信:命名管道FIFO

文章目录

        • FIFO 通信特点
        • 系统调用接口
        • 应用
          • 拥有亲缘关系之间的进程通信
          • 非亲缘关系进程之间的通信
        • 总结

FIFO 通信特点

  • FIFO文件有文件名
    • 可以像普通文件一样存储在文件系统之中
    • 可以像普通文件一样使用open/write读写
    • 和pipe文件一样属于流式文件,不能使用lseek系统调用重定位文件偏移地址
  • 具有写入原子性,支持多个进程同时对FIFO进行写操作,如日志系统/var/log
  • First in First out,先入先出。最先被写入的数据最先被读出来
    • 默认阻塞读,阻塞写的特性。可以在open的时候进行设置
    • 如果一个进程打开fifo的一端时,令一端没有打开,该进程会被阻塞。

fifo与pipe最大的区别就是pipe只能用于亲缘进程之间的通信(fork方式创建的父子进程),但是fifo可以支持任意两个进程之间的通信,并包括拥有亲缘关系的进程

系统调用接口

  • shell命令:mkfifo pathname,可以通过man mkfifo查看命令用法
  • 函数接口:int mkfifo(const char *pathname,mode_t mode)
  • 函数功能:创建fifo的有名管道
  • 函数参数:
    - pathname FIFO管道文件名
    - mode 读写权限

应用

拥有亲缘关系之间的进程通信

通信过程类似于pipe的fd[0]读出,fd[1]写入


#include <sys/types.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <stdio.h>#define FIFO "testfifo"
int main()
{int a=mkfifo(FIFO,0644);if (0 != a)printf("mkfifo failed %d\n",a);int ret,fifo_fd;ret = fork();if (ret == -1) {perror("fork");_exit(-1);}//子进程负责写入管道else if (ret == 0) {fifo_fd = open("testfifo",O_RDWR);char buf[100];memset(buf,0,100);printf("child process(%d) input msg:",getpid());//scanf("%s",buf);fgets(buf,10,stdin);int write_len = write(fifo_fd,buf,strlen(buf));printf("%d bytes has been sent\n",write_len);_exit(1);}//父进程进行从管道进行读取else {sleep(5);fifo_fd = open("testfifo",O_RDWR);char buf[100];memset(buf,0,100);printf("father process befor read\n");int read_len = read(fifo_fd,buf,100);if (read_len == -1)printf("read error %d\n",read_len);printf("father process(%d) read message from fifo :%s\n",getpid(),buf);_exit(1);}return 0;
}
非亲缘关系进程之间的通信

写端:


#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define FIFO_NAME "testfifo"int main(int argc, char* argv[])
{int fd;char buf[100];mkfifo(FIFO_NAME, S_IFIFO|0666);//循环向testinfo中写入数据while (1){printf("please input the string : \n");fd = open(FIFO_NAME, O_WRONLY);fgets(buf,100,stdin);write(fd, buf, strlen(buf)+1);close(fd);}unlink(FIFO_NAME); //删除命名管道文件sleep(1);return 0;
}

读端:

#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define FIFO_NAME "testfifo"
#define BUF_SIZE 1024int main(int argc, char* argv[])
{int fd;char buf[BUF_SIZE];//循环从testinfo中读取数据while (1) {fd = open(FIFO_NAME, O_RDONLY);//read系统调用会从打开的文件当前文件偏移地址开始读,即上次写入的数据read(fd, buf, BUF_SIZE);printf("%s\n", buf);close(fd);}return 0;
}

总结

为什么无名管道只能用于父子进程之间的通信呢?无名管道是一个文件,但是只能存在与内存之中,且该文件的读写方式是固定的,我们只能从一端写入,一端读出。使用无名管道通信,他得文件句柄需要在同一个进程内共享。即在同一个进程内只有fork的方式,能够将当前进程所有文件描述符以及进程状态信息拷贝给另一个进程;只有在这样的进程关系之下,无名管道的数据传输才能实现一端写入,一端读出。

命名管道fifo可以像普通文件一样存在与操作系统磁盘之中,同样支持read/write的数据读写,因此它能够被多个进程共同访问。虽然fifo相比于pipe使用范围扩大了,但是总体的阻塞式通信依然存在。

pipe的内核实现fs/pipe.cpipe_readpipe_write函数处理过程中都是通过加锁mutex来实现,并没有相关的异步操作,而fifo的fifo_open函数同样是阻塞式处理函数体。

相关文章:

mysql 账户管理_如何用MySQL 命令来实现账户管理

今天我们要学习的是如何用MySQL 命令的方式来对账号进行管理&#xff0c;我们大家都知道在实际应用中MySQL 命令可以完成多种任务&#xff0c;以下的文章主要是对用MySQL 命令的方式来对账号进行管理的具体内容介绍。手册上说 “GRANT语句允许系统管理员创建MySQL用户账户&…

Can't connect to MySQL server on '127.0.0.1' (10061) (code 2003)解决方法

先验证一下MySQL的服务是否开启&#xff0c;到计算机->管理->服务和应用程序->服务 如果服务已开启&#xff0c;就检查一下C:\WINDOWS\system32\drivers\etc目录下的hosts文件&#xff0c; 是否存在这一下&#xff0c;不存在添加。 最后在mysql的配置文件my.ini中[mys…

学习MongoDB (1) :配置安装

为什么80%的码农都做不了架构师&#xff1f;>>> MongoDB是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用的功能&#xff0c;如辅助索引、范围查询、排序。 最近开始在Windows 32位平台下研究MongoDB的使用&#xff0c;为了方便&#xff…

跨域策略文件crossdomain.xml文件

使用crossdomain.xml让Flash可以跨域传输数据 一、crossdomain.xml文件的作用 跨域&#xff0c;顾名思义就是需要的资源不在自己的域服务器上&#xff0c;需要访问其他域服务器。跨域策略文件是一个xml文档文件&#xff0c;主要是为web客户端(如Adobe Flash Player等)设置跨…

linux进程间通信:FIFO应用 /var/log/ 系统日志的模拟实现

在类unix操作系统下存在这样一个目录/var/log/&#xff0c;主要是记录操作系统相关的系统各个进程服务的日志信息 该日志系统的特性如下&#xff1a; 支持多进程并发写入同一文件不同进程日志信息可以写入不同文件支持使用head/tail/grep/cat/vi 等命令进行日志操作 我们可以…

context.xml mysql_在tomcat下context.xml中配置各种数据库连接池(示例代码)

Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下。我们可以在这里找到 server.xml 和 context.xml。当然&#xff0c;还有其他一些资源文件。但是在在本文中我们只用得上这两个&#xff0c;其他的就不介绍了。1,首先&#xff0c;需要为数据源配置一个JNDI资源。我们的数…

Planetary.js:帮助你构建超炫的互动球体效果

Planetary.js 是一个 JavaScript 库&#xff0c;用于构建互动球体效果。它使用 D3 和 TopoJSON 解析和渲染地理数据。Planetary.js 采用了基于插件的架构&#xff0c;即使是默认的功能是作为插件实现的&#xff0c;这使得 Planetary.js 非常灵活。Planetary.js 是完全可定制&am…

JAVA条件表达式的陷阱

Map<String, Integer> map new HashMap<String, Integer>(); map.put("count", null); Integer it map null ? 0 : map.get("count"); 注意&#xff1a;在第三行&#xff0c;会抛出java.lang.NullPointerException信息。因为分析&…

腾讯Bugly异常崩溃SDK接入

首先登入Bugly&#xff0c;创建应用&#xff0c;记录下AppId ①下载SDK&#xff0c;通过Cocoapods集成 pod Bugly #腾讯异常崩溃日志服务 ②导入头文件&#xff0c;并初始化 /** 腾讯Bugly */#import <…

linux进程间通信:FIFO实现进程间的双向通信

fifo的双向通信的方式如下图&#xff1a; 两个进程间的通信需要两个命名管道&#xff0c;分别处理一个进程的读和写 导致这种通信方式出现的根因还是由于fifo的阻塞读和阻塞写&#xff0c;所以这里需要使用两个管道对读写进行分别处理。 同时因为管道传输的数据为流式数据&…

load python txt文件_详解Python中numpy.loadtxt()读取txt文件

为了方便使用和记忆&#xff0c;有时候我们会把 numpy.loadtxt() 缩写成np.loadtxt() ,本篇文章主要讲解用它来读取txt文件。读取txt文件我们通常使用 numpy 中的 loadtxt()函数numpy.loadtxt(fname, dtype, comments#, delimiterNone, convertersNone, skiprows0, usecolsNone…

线程之线程标识

就像每个进程有一个进程ID一样&#xff0c;每个线程也有一个线程ID。进程ID在整个系统中是唯一的&#xff0c;但线程ID不同&#xff0c;线程ID只在它所属的进程环境中有效。 进程ID&#xff0c;用pid_t数据类型来表示&#xff0c;是一个非负整数。线程ID则用pthread_t数据类型来…

Tab Bar Animation

2019独角兽企业重金招聘Python工程师标准>>> 自定义UITabBar。自定义Tab Bar切换过程中的动画效果。用户点击某个Tab&#xff0c;一个小箭头会从之前的Tab上面移动到当前点击的Tab上面。可以在tab上面加上小箭头用于显示当前处于哪个tab。 Code4App编译测试&#xf…

CynosDB技术详解——存储集群管理

本文由腾讯云数据库发表 前言 CynosDB是架构在CynosFS之上的分布式关系数据库系统&#xff0c;为最大化利用存储资源&#xff0c;平衡资源之间的竞争&#xff0c;检查资源使用情况&#xff0c;需要一套高效稳定的分布式集群管理系统&#xff08;SCM: Storage Cluster Manager&a…

linux进程间通信:system V消息队列

文章目录基本介绍编程接口代码实例消息队列的发送和接收消息队列中的消息对象的属性控制基本介绍 支持不同进程之间以消息&#xff08;messages&#xff09;的形式进行数据交换&#xff0c;消息能够拥有自己的标识&#xff0c;且内核使用链表方式进行消息管理。进程之间的通信…

将一个一维数组转化为二进制表示矩阵。例如_算法之矩阵最大区域问题

例如&#xff1a;给定一个m*m(0<n)的矩阵&#xff0c;请找到此矩阵的一个子矩阵&#xff0c;并且此子矩阵的各个元素的和最大&#xff0c;输出这个最大的值。或者给出一个柱形矩阵求最大子矩阵的最大值。首先我们需要了解一下最大字段和问题。最大子段和问题给定一个长度为n…

伪元素first-letter

用于设置一个块级元素首位字符的样式&#xff0c;而且仅对该字符设置样式 p&#xff1a;first-letter{ font-size&#xff1a;200%}是让P中的第一个字符是其他字符大小的两倍转载于:https://www.cnblogs.com/damade/p/3518583.html

fedora17 的 rc.local

Fedora17上已经找不到/etc/rc.local了&#xff0c;如果我们想开机执行某个脚本&#xff0c;就需要手动创建这个文件&#xff0c;目录也发生了小小变化&#xff1a; 1. 新建文件/etc/rc.d/rc.local&#xff0c;第一行须指明执行shell&#xff1a; [root www.linuxidc.com rc.d]#…

使用TortoiseGit,设置ssh方式连接git仓库。

开始设置之前的准备&#xff1a;建立项目文件夹&#xff0c;初始化git仓库(右键 git init)&#xff0c;右键打开 git bash &#xff0c;git pull “仓库地址”, 把网站上的仓库代码拉取下来。 TortoiseGit使用扩展名为ppk的密钥&#xff0c;而不是ssh-keygen生成的rsa密钥。 也…

linux进程间通信:消息队列实现双端通信

双端通信描述 利用消息队列针对发送接受消息的类型唯一性 进行多个客户端之间消息传递&#xff0c;而不需要server端进行消息转发。 同时消息队列的读阻塞和写阻塞特性&#xff08;消息队列中已经写入数据&#xff0c;如果再不读出来&#xff0c;则无法再次写入&#xff09;让…

windows 软件安装事件_苹果安装windows,报windows支持软件未能存储到所选驱动器

今天去给一个IT外包客户维修电脑&#xff0c;前台的一台苹果电脑需要安装双系统&#xff0c;苹果电脑安装双系统对我们专业安装系统工程师来说&#xff0c;这不是很简单的嘛&#xff01;客户问需要多长时间&#xff0c;信心满的说一到两个小时&#xff01;客户说那你开始弄吧。…

C# Attribute简介

一 、EventAttribute有&#xff1a; BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、DefaultEventAttribute PropertyAttribute有&#xff1a; BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、 DefaultPropertyAttribute、DefaultValueAttri…

P2P之UDP穿透NAT的原理

关键词: P2P UDP NAT 原理 穿透 Traveral Symmetric Cone原始作者: Hwycheng Leo(FlashBTHotmail.com)源码下载: http://bbs.hwysoft.com/download/UDP-NAT-LEO.rar参考&#xff1a;http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt P2P之UDP穿透NAT的原理…

快速幂运算and 快速乘运算

ll qpow(ll a,ll b) {ll ans1;while(b){if(b&1) ans(ans*a)%mod;a(a*a)%mod;b>>1;}return ans; } 快速乘运算 ll mult(ll a,ll b,ll mod) {a%mod,b%mod;ll sa,sum0;while(b){if (b&1){sums;if (sum>mod)sum-mod;}b>>1;s<<1;if (s>mod)s-mod;}r…

linux进程间通信:system V 共享内存

文章目录思维导图如下通信原理优势运行流程编程接口编程实例思维导图如下 通信原理 多个进程共享物理内存的同一块区域&#xff08;通常称之为“段”:segment&#xff09;抛弃了内核态消息转存处理的过程&#xff0c;让两个进程直接通过一块内存进行通信 我们普通的像PIPE,FI…

python函数手册68_直接在python中检索68个内置函数?

Python 3.5中的一种方法是列出具有__module__属性的对象,并将其设置为builtins和lowercase name&#xff1a;>>> sorted(k for k, v in vars(__builtins__).items()if k.islower() and getattr(v, __module__, ) builtins)[__build_class__, __import__, abs, all, a…

《深入理解Java虚拟机》笔记3

垃圾收集算法 (1)标记清除 根据根搜索确定对象是否已死&#xff0c;已死对象标记&#xff0c;然后一起清除。 这个其实不算什么算法&#xff0c;最正常想法应该就是这样。但是&#xff0c;缺点 是效率不高&#xff0c;如果有很多不连续的小对象需要回收&#xff0c;会花好多时间…

Step-By-Step在AIX上安装Oracle RAC

最近遇到一个项目&#xff0c;是在AIX5.3上安装ORACLE 9i RAC&#xff0c;说实话&#xff0c;ORACLE俺压根就没有接触过&#xff0c;我也是临危受命。感觉如同当年实施AS400的XSM项目一般。无奈&#xff0c;下载了N多本REDBOOK开始研究&#xff0c;终于有了些眉目&#xff0c;找…

Python中输出字体的颜色设置

1.实现过程 终端的字符颜色是用转义序列控制的&#xff0c;是文本模式下的系统显示功能&#xff0c;和具体的语言无关。控制字符颜色的转义序列是以ESC开头,即用\033来完成 2.书写过程开头部分: \033[显示方式;前景色;背景色m结尾部分: \033[0m注意&#xff1a;开头部分的三个…

linux进程间通信:system V 信号量

文章目录概念描述通信原理编程接口使用流程编程案例概念描述 英文&#xff1a;semaphore 简称SEM&#xff0c;主要用来进行进程间同步本质&#xff1a;内核维护的一个正整数&#xff0c;可对其进行各种/-操作分类&#xff1a;systemV 信号量、POSIX 有名信号量、POSIX 无名信号…