练习--LINUX进程间通信之有名管理FIFO
从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相关推荐
- linux进程间通信:命名管道FIFO
文章目录 FIFO 通信特点 系统调用接口 应用 拥有亲缘关系之间的进程通信 非亲缘关系进程之间的通信 总结 FIFO 通信特点 FIFO文件有文件名 可以像普通文件一样存储在文件系统之中 可以像普通 ...
- 开发日记-20190823 linux有名管道fifo,进程间通信
转载于和感谢:linux有名管道fifo,进程间通信 命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程 ...
- 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较
前言:上一节提到IPC的概述,本一节,原文作者比较详细的讨论了,管道的概念和实例和使用场景: 原文作者:郑彦兴 (mlinux@163.com)国防科大计算机学院 http://www.ibm.com ...
- linux 进程间通信及makefile 无名管道/有名管道/共享内存/信号/消息队列
http://www.voidcn.com/article/p-hxvuiypm-mr.html https://www.cnblogs.com/wuyida/archive/2013/02/03/6 ...
- Linux进程间通信(管道、消息队列、共享内存、信号、信号量)
目录 Linux进程间通信概述 1.管道 无名管道(pipe) 有名管道(fifo) 2.消息队列(msg) 消息队列的通信原理 消息队列相关api 消息队列收发数据 键值生成 消息队列移除 3.共享 ...
- linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]
Linux高级程序设计(第2版)以Linux操作系统(内核为2.6版本)为开发平台.GCC 4.0/GDB 6.3为开发调试环境,详细介绍了Linux系统下编程环境及编程工具.文件管理(文件类型.AN ...
- Linux进程间通信[转]
一.进程间通信概述 进程通信有如下一些目的: A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修 ...
- linux有名管道数据异常,Linux系统编程—有名管道
▋****1. 管道的概念 管道,又名「无名管理」,或「匿名管道」,管道是一种非常基本,也是使用非常频繁的IPC方式. 1.1 管道本质 管道的本质也是一种文件,不过是伪文件,实际上是一块内核缓冲区, ...
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...
- 20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结
20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在 ...
最新文章
- 新书来了!《ActionScript 3.0游戏设计基础(第2版)》
- Asp.Net 构架(HttpModule 介绍)
- okhttp通过post发送Json数据到php 更新数据库
- 线程 、进程、协程 三者区别
- 【Android 逆向】ELF 文件格式总结 ★★★
- java 方法大全_java中的方法大全
- 不用中间变量交换a和b的值?
- JAVA定义一个多边形类_如何在每个数据类别中绘制多个多边形?
- NOIP2016 D2T3 愤怒的小鸟
- AbstractQueuedSynchronizer理解之三(Semaphore)
- Resco Photo Viewer for WinCE6.0
- Python适合大数据处理吗?
- iservice list方法_扩展IList对象,实现深拷贝扩展方法
- PyQT简单入门--hello world
- matlab 马丢函数,振幅调制产生马丢光束的方法与流程
- LINUX内核内存管理kmalloc,vmalloc
- 如何求七参数以及七参数在软件中的应用
- FPGA时序分析和时序约束
- 考研人最烦的6句话,教你霸气回怼!
- 语言模型训练工具SRILM