命名管道的主要用途:不相关的进程之间交换数据。

命令行上创建命名管道:

$ mkfifo filename

程序中创建命名管道:

#include

#include

int mkfifo(const char *filename, mode_t mode);

备注:#include 是unix/linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型。

#include是unix/linux系统定义文件状态所在的伪标准头文件。

例程:创建一个fifo命名管道

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

int res;

res = mkfifo("./fifo", 0777);

if(res == 0)

{

printf("fifo created\n");

}

exit(exit_success);

}

备注:文件权限方面的知识有点模糊,需要回顾。

$ ls -lf(f选项会在显示目录条目时,在目录后加一个符号“/”表示文件夹 “|”表示管道)

prwxr-xr-x 1 root root 0 12月 17 17:02 fifo|

创建出来的fifo管道如上图所示,其中第一个字符p表示这是一个管道,其中最后一个|符号是由ls命令的-f选项所添加,也表示它是一个管道。

fifo是以命名文件的形式存在,而不是打开的文件描述符,所以在对它进行读写操作之前必须先打开它。而且,对于fifo来说,传递给open函数的第一个参数一定是一个fifo的路径名,而不是一个文件名。

使用open打开fifo文件

1.fifo命名管道不能以o_rdwr的模式打开,会产生二义性。(通常使用fifo只是为了单向传递数据)

2.如果确定需要程序之间双向传递数据。①最好使用一对fifo或者管道,一个方向使用一个②采用先关闭再重新打开fifo的方法来明确地改变数据流的去向(不常用)。

3.打开fifo文件和打开普通文件的另一点区别是:对open_flag(open的第二个参数)的o_nonblock的用法。

open(const char *path, o_rdonly);

在这种情况下,open调用将阻塞,除非有一个进程以写方式打开一个fifo,否则它是不会返回。

open(const char *path, o_rdonly | o_nonblock);

即使没有其他进程以写方式打开fifo,open调用也会成功并且立即返回。

open(const char *path, wronly);

在这种情况下,open调用将阻塞,直到有一个进程以读方式打开进程。

open(const char *path,  wronly | o_nonblock);

这个函数调用总是立刻返回,但如果没有进程以读方式打开fifo文件,open调用将返回一个错误-1并且fifo也不会被打开。如果确实有一个进程以读方式打开fifo文件,那么我们就我再可以通过它返回的文件描述符对这个fifo文件进行写操作。

#include

#include

#include

#include

#include

#include /* using string */

#include /* o_rdonly in this file */

#define file_name "/home/test/readfifo"

int main(int argc, char *argv[])

{

int res;

if(access(file_name, f_ok) == -1)

{

res = mkfifo(file_name, 0777);

if(res != 0)

{

printf("the fifo file could not create\n");

exit(exit_failure);

}

}

printf("read fifo file create successfull \n");

open(file_name, o_rdonly | o_nonblock);

printf("open the read fifo file is success \n");

exit(exit_success);

}

备注:string.h在使用到字符数组时需要使用。

fcntl.h是unix标准中通用的头文件,其中包含相关函数有open,fcntl,shutdown,unlink,fclose等。与unistd.h相比,后者定义了更多的函数原型。

在open的函数调用中,如果是非阻塞。

read fifo file create successfull

open the read fifo file is success

在open的函数调用中,如果是阻塞,即没有使用o_nonblock

read fifo file create successfull

就会阻塞在open函数上,然后等待写进程打开这个函数,然后才会返回。

注意:linux中进程被阻塞时,并不消耗cpu资源。

对fifo进行读写操作

如果在open函数使用了o_nonblock模式,会影响到对fifo的read和write调用。

对一个空的、阻塞的fifo(即没有用o_nonblock标志打开的)的read调用将等待,直到有数据可以读时才继续执行。

对一个空的、非阻塞的fifo的read调用将立刻返回0字节。

对一个完全阻塞fifo的write调用将等待,知道数据可以被写入才继续执行,如果fifo不能接受所有写入数据,将按照下面的规则执行:①如果请求写入的数据长度小于等于pipe_buf字节,调用失败,数据不能写入。(表示有空间,但是不能写入,出现问题)。②如果请求写入的数据的长度大于pipe_buf字节,将写入部分数据,返回实际写入的字节数,返回值也可能是0(表示只是fifo的空间不足,先写入部分数据)。

注意:pipe_buf是系统对fifo的一个数据长度的限制,通常在头文件limits.h可以找到它,通常值为4096字节,也有特例。系统规定:在一个以o_wronly方式(即阻塞方式)打开的fifo中,如果写入的数据长度小于等于pipe_buf,要么全部一次性写入,要么一个字节也不写入。

基于“注意”中的描述,如果出现一种情况:多个程序向一个fifo中写入数据的时候,为了保证这些写入的数据不会相互交错重叠,那么就要求每次写入的数据长度要小于等于pipe_buf字节。

linux 命名管道通信速度,《Linux 进程间通信》命名管道:FIFO相关推荐

  1. Linux系统无名管道通信实验,Linux进程间通信(二)---管道通信之无名管道及其基础实验...

    管道简介 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子).Linux的管道主要包括两种:无名管道和有名管道.这一节主要讲 ...

  2. linux进程管道通信缺点,Linux 进程间通信(1) -- 管道

    进程间通信(IPC - InterProcess Communication) 通信的方式有很多: 文件, 管道, 信号, 共享内存, 消息队列, 套接字, 命名管道等等; 但是由于设计缺陷现在常用的 ...

  3. Linux多线程间通信和多进程间通信的方式

    文章目录 一.进程间的通信方式 1. 进程间通信的概念 1.1. 进程通信的目的: 1.2. Linux 进程间通信(IPC)的发展 2. 进程间通信的7种方式 2.1. 管道/匿名管道(pipe) ...

  4. linux内核剖析(八)进程间通信之-管道

    管道 管道是一种两个进程间进行单向通信的机制. 因为管道传递数据的单向性,管道又称为半双工管道. 管道的这一特点决定了器使用的局限性.管道是Linux支持的最初Unix IPC形式之一,具有以下特点: ...

  5. linux进程管道通信缺点,Linux进程通信(IPC)的方式详解

    前言:Linux进程通信的方式 什么是进程通信?进程通信是指进程之间交换信息 进程通信方式共有6种: 管道(pipe),包括流管道(s_pipe)和有名管道(named pipe) 信号(signal ...

  6. linux共享存储通信实验,Linux进程通信——共享存储

    共享内存是进程间通信最有用的方式,也是最快的IPC形式.共享内存是说:同一块内存被映射到多个进程的地址空间.但是共享内存并不提供同步机制,因此需要互斥锁或者信号量.使用共享内存唯一需要注意的是:当前如 ...

  7. linux rsync删文件速度,Linux下使用rsync最快速删除大量文件的方法

    要在Linux下删除海量文件的情况,需要删除三层哈希目录下的几十万个文件.这个时候,删除命令rm -rf * 就不好用了,因为要等待的时间太长.所以必须要采取一些非常手段.我们可以使用rsync来实现 ...

  8. linux 嵌入式串口通信,基于linux的嵌入式串口通信综述.doc

    PAGE 天津电子信息职业技术学院 <嵌入式软件编程>课程报告 课程名称:基于linux的嵌入式串口通信课程代码: 115229 姓 名: 甘琦 学 号: 48 专 业: 物联网应用技术 ...

  9. linux系统udp通信程序,Linux UDP socket编程(UDP通讯模型) | C/C++程序员之家

    Linux UDP socket编程(UDP通讯模型): UDPClient + UDPService. Linux下大多数网络程序都是基于TCP的,很少基于UDP,简单的通讯模型如下,开发时候备用! ...

最新文章

  1. 设计模式 - 结构型 - 装饰者模式
  2. Linux下服务器端开发流程及相关工具介绍(C++)
  3. Kali Linux常用服务配置教程DHCP服务原理
  4. 修改UISearchBar背景
  5. python程序实例源代码-Python 神经网络手写识别实例源码
  6. 字符串的最大最小表示法 模板
  7. shell模拟php多进程从redis获取数据
  8. 【数据结构与算法】之深入解析“下一个更大元素III”的求解思路与算法示例
  9. ElasticSearch Java Api(一) -创建索引
  10. php composer 安装,composer安装的方法步骤(图文)
  11. java微服务实战.pdf_Spring微服务实战 ([美]约翰·卡内尔) 中文完整pdf扫描版[172MB]...
  12. 404 Note Found 队-Alpha9
  13. coreldraw快速撤回_cdr返回上一步的快捷键是什么?
  14. 主成分分析(PCA)与线性判别分析(LDA)的区别与联系
  15. 生存分析(Survival Analysis)、Cox风险比例回归模型(Cox proportional hazards model)及
  16. H3CNE V7.0 视频教程
  17. 地图坐标转换(84坐标、百度坐标、国测局坐标)
  18. 计算机技能大赛 英语,计算机科学与技术学院英语技能大赛圆满结束
  19. 一种MATLAB中解复杂方程(高次、指数、无解析解)的方法,可以在实现论文中公式时使用,solve函数。
  20. 【C语言-库函数模拟】字符串库函数模拟

热门文章

  1. 百变分销级差模式商城v2.0.6
  2. 动态规划一:动态规划算法如何设计
  3. HTML保姆级教程——赠予我的粉头哈哈哈哈哈哈哈哈哈哈
  4. 解决Win11开机内存占用过高的情况
  5. 【Servlet-过滤器】
  6. Springboot毕设项目欢乐购商城系统1l1e1(java+VUE+Mybatis+Maven+Mysql)
  7. 大气颗粒物PMF源解析
  8. 魔王语言C语言 使用头文件封装 链表链栈顺序队列的基本操作
  9. fastadmin 表格,表格中隐藏列但在搜索中有该筛选项
  10. python安装Crypto