从FIFO中读取数据:

约定:如果一个进程为了从FIFO中读取数据而阻塞打开FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作。

  • 如果有进程写打开FIFO,且当前FIFO内没有数据,则对于设置了阻塞标志的读操作来说,将一直阻塞。对于没有设置阻塞标志读操作来说则返回-1,当前errno值为EAGAIN,提醒以后再试。
  • 对于设置了阻塞标志的读操作说,造成阻塞的原因有两种:当前FIFO内有数据,但有其它进程在读这些数据;另外就是FIFO内没有数据。解阻塞的原因则是FIFO中有新的数据写入,不论信写入数据量的大小,也不论读操作请求多少数据量。
  • 读打开的阻塞标志只对本进程第一个读操作施加作用,如果本进程内有多个读操作序列,则在第一个读操作被唤醒并完成读操作后,其它将要执行的读操作将不再阻塞,即使在执行读操作时,FIFO中没有数据也一样(此时,读操作返回0)。
  • 如果没有进程写打开FIFO,则设置了阻塞标志的读操作会阻塞。

注:如果FIFO中有数据,则设置了阻塞标志的读操作不会因为FIFO中的字节数小于请求读的字节数而阻塞,此时,读操作会返回FIFO中现有的数据量。

向FIFO中写入数据:

约定:如果一个进程为了向FIFO中写入数据而阻塞打开FIFO,那么称该进程内的写操作为设置了阻塞标志的写操作。

对于设置了阻塞标志的写操作:

  • 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。如果此时管道空闲缓冲区不足以容纳要写入的字节数,则进入睡眠,直到当缓冲区中能够容纳要写入的字节数时,才开始进行一次性写操作。
  • 当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。FIFO缓冲区一有空闲区域,写进程就会试图向管道写入数据,写操作在写完所有请求写的数据后返回。

对于没有设置阻塞标志的写操作:

  • 当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。在写满所有FIFO空闲缓冲区后,写操作返回。
  • 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。如果当前FIFO空闲缓冲区能够容纳请求写入的字节数,写完后成功返回;如果当前FIFO空闲缓冲区不能够容纳请求写入的字节数,则返回EAGAIN错误,提醒以后再写;

代码可能打错,因为无输出。。:)

等以后有实际用途再说吧,

现在关键是理解一下思想。

清除阻塞和非阻塞读写的原子性之类的东东。

所以,没有一种模式是绝对标准,一定要整合业务场景需求。

/****************** * test.c* *
******************/
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>#define FIFO_SERVER "/tmp/fifoserver"main(int argc, char** argv)
{int fd;char w_buf[4096*2];int real_wnum;memset(w_buf, 0, 4096*2);if((mkfifo(FIFO_SERVER, O_CREAT|O_EXCL)<0)&&(errno != EEXIST)){printf("cannot create fifoserver");}if(fd == -1){if(errno == ENXIO){printf("openerror; no reading process");}}fd = open(FIFO_SERVER, O_WRONLY|O_NONBLOCK, 0);// fd = open(FIFO_SERVER, O_WRONLY, 0);real_wnum = write(fd, w_buf, 2048);if(real_wnum == -1){if(errno == EAGAIN){printf("write to fifo error; try late");}}else{printf("real write num is %d\n", real_wnum);}real_wnum = write(fd, w_buf, 5000);// real_wnum = write(fd, w_buf, 4096);if(real_wnum == -1){if(errno == EAGAIN){printf("try later\n");}}
}

转载于:https://www.cnblogs.com/aguncn/p/4984990.html

练习--LINUX进程间通信之有名管理FIFO相关推荐

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

    文章目录 FIFO 通信特点 系统调用接口 应用 拥有亲缘关系之间的进程通信 非亲缘关系进程之间的通信 总结 FIFO 通信特点 FIFO文件有文件名 可以像普通文件一样存储在文件系统之中 可以像普通 ...

  2. 开发日记-20190823 linux有名管道fifo,进程间通信

    转载于和感谢:linux有名管道fifo,进程间通信 命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程 ...

  3. 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较

    前言:上一节提到IPC的概述,本一节,原文作者比较详细的讨论了,管道的概念和实例和使用场景: 原文作者:郑彦兴 (mlinux@163.com)国防科大计算机学院 http://www.ibm.com ...

  4. linux 进程间通信及makefile 无名管道/有名管道/共享内存/信号/消息队列

    http://www.voidcn.com/article/p-hxvuiypm-mr.html https://www.cnblogs.com/wuyida/archive/2013/02/03/6 ...

  5. Linux进程间通信(管道、消息队列、共享内存、信号、信号量)

    目录 Linux进程间通信概述 1.管道 无名管道(pipe) 有名管道(fifo) 2.消息队列(msg) 消息队列的通信原理 消息队列相关api 消息队列收发数据 键值生成 消息队列移除 3.共享 ...

  6. linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]

    Linux高级程序设计(第2版)以Linux操作系统(内核为2.6版本)为开发平台.GCC 4.0/GDB 6.3为开发调试环境,详细介绍了Linux系统下编程环境及编程工具.文件管理(文件类型.AN ...

  7. Linux进程间通信[转]

    一.进程间通信概述 进程通信有如下一些目的: A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修 ...

  8. linux有名管道数据异常,Linux系统编程—有名管道

    ▋****1. 管道的概念 管道,又名「无名管理」,或「匿名管道」,管道是一种非常基本,也是使用非常频繁的IPC方式. 1.1 管道本质 管道的本质也是一种文件,不过是伪文件,实际上是一块内核缓冲区, ...

  9. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  10. 20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

    20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在 ...

最新文章

  1. 新书来了!《ActionScript 3.0游戏设计基础(第2版)》
  2. Asp.Net 构架(HttpModule 介绍)
  3. okhttp通过post发送Json数据到php 更新数据库
  4. 线程 、进程、协程 三者区别
  5. 【Android 逆向】ELF 文件格式总结 ★★★
  6. java 方法大全_java中的方法大全
  7. 不用中间变量交换a和b的值?
  8. JAVA定义一个多边形类_如何在每个数据类别中绘制多个多边形?
  9. NOIP2016 D2T3 愤怒的小鸟
  10. AbstractQueuedSynchronizer理解之三(Semaphore)
  11. Resco Photo Viewer for WinCE6.0
  12. Python适合大数据处理吗?
  13. iservice list方法_扩展IList对象,实现深拷贝扩展方法
  14. PyQT简单入门--hello world
  15. matlab 马丢函数,振幅调制产生马丢光束的方法与流程
  16. LINUX内核内存管理kmalloc,vmalloc
  17. 如何求七参数以及七参数在软件中的应用
  18. FPGA时序分析和时序约束
  19. 考研人最烦的6句话,教你霸气回怼!
  20. 语言模型训练工具SRILM

热门文章

  1. 谈谈 Linux 假死现象
  2. 一天能写2000行代码的实习生,到底是不是一个程序员的好苗子?
  3. 面试14种神回复,HR妹子可能会爱上你!
  4. Docker JDK镜像
  5. dubbo安装和使用
  6. 网站改版进行时,需要注意的
  7. 《信息安全工程》读书笔记
  8. fg、bg、jobs、、ctrl + z命令
  9. 巴巴运动网学习笔记(51-55)
  10. 公司居然使用监听设备,大家来讨论下IT公司应该怎样管理