从本质上说,管道也是一种文件,但他又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题

限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中该换冲区的大小为一页,4k

使得他的大小不像文件那样不加检验的增长。使用固定缓冲区也会带来问题,比如再写管道时可能变满

当这种情况发生时,随后对管道的write()调用被阻塞,等待某些数据被读取,以便腾出足够的空间供

write()调用。

读取工作也可能比写的进程快。当所有进程的数据被读取完时,一个随后的read()调用将默认的被阻塞、

管道变空。这种情况发生时,一个随后的read()调用将被默认的阻塞,等待某些数据被写入,这样就解决了read()

调用将被默认的阻塞,等待某些数据将被写入,这解决了read()调用返回文件结束的问题。

一个管道的容量是有限的。POSIX规定,少于 PIPE_BUF 的写操作必须原子完成:要写的数据应被连续的写到管道;大于 PIPE_BUF 的写操作可能是非原子的: 内核可能会把此数据与其它进程的对此管道的写操作交替起来。POSIX规定PIPE_BUF至少为512B(linux中为4096B),具体的语义如下: 其中n为要写的字节数

n <= PIPE_BUF, O_NONBLOCK无效:原子的写入n个字节。如果管道当前的剩余空间不足以立即写入n个字节,就阻塞直到有足够的空间。

n <= PIPE_BUF, O_NONBLOCK有效:写入具有原子性,如果有足够的空间写入n个字节,write立即成功返回。否则一个都不写入,返回错误,并设置errno为EAGAIN。

n > PIPE_BUF, O_NONBLOCK无效:非原子写。可能会和其它的写进程交替写。write阻塞直到将n个字节写入管道。

n > PIPE_BUF, O_NONBLOCK有效:如果管道满,则write失败,返回错误,并将errno设置为 EAGIN。如果不满,则返回写入的字节数为1~n,即部分写入,写入时可能有其他进程穿插写入。

结论:

1、当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。

2、当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

Linux数据写操作改进

Linux的IO操作中数据的写函数int nwrite = write(int fd,void* buf ,int len)表示向fd文件描述符写入len个字节长度的数据报文,但是这并不能保证真正向内 ...

使用C&num;给Linux写Shell脚本(下篇)

在上篇的结尾中,我们留下了一个关于C#如何调用BashShell的问题.在文章发布之后,我留意到有读者留言推荐使用“Pash”(一款类PowerSh ...

NoSQL生态系统——事务机制,行锁,LSM,缓存多次写操作,RWN

13.2.4 事务机制 NoSQL系统通常注重性能和扩展性,而非事务机制. 传统的SQL数据库的事务通常都是支持ACID的强事务机制.要保证数据的一致性,通常多个事务是不可能交叉执行的,这样就导致了可 ...

linux常用操作指令

Linux常用操作指令: 常用指令 ls        显示文件或目录 -l           列出文件详细信息l(list) -a          列出当前目录下所有文件及目录,包括隐藏的a(a ...

你一定要知道的关于Linux文件目录操作的12个常用命令

写在前面: 1,是楼主收集的关于Linux文件目录操作最常用的命令,包括文件或目录的新建.拷贝.移动.删除.查看等,是开发人员操 ...

Linux常用操作练习

Linux常用操作练习 练习一:安装CentOS 1.设置为1G内存(才有图形界面).10G硬盘 2.分给交换分区2G(4G一下2G,8G-32G分4G-8G) 练习二:安装CentOS迷你版 1.安 ...

linux 常用操作以及概念

一.常用操作以及概念 查看LINUX发行版的名称及其版本号的命令: lsb_release -a cat /etc/redhat-release(针对redhat,Fedora) 0.rpm包路径:/ ...

python通过SSH登陆linux并操作

使用python通过SSH登陆linux并操作 用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的. 代码: > ...

多线程之:volatile变量的一次写操作的过程

一:对volatile修饰的变量进行一次写操作的完整过程   在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配.其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程 ...

随机推荐

log4j2的使用

预备知识 日志级别:log4j默认六个级别,即trace.debug.info.warn.error.fatal ,对应意味着该消息为追踪.调试.普通信息.警告.错误.严重错误.可以根据需要子定义其他 ...

C&num;&period;Net 上传图片&comma;限制图片大小&comma;检查类型完整版

C#.Net 上传图片,限制图片大小,检查类型完整版 源代码: 处理图片类,如检查图片大小,按宽度比例缩小图片 public class CImageLibrary{   public enum Va ...

iOS学习笔记---c语言第九天

高级指针 指向结构体变量的指针,称为结构体指针 可以使用->指向内容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求两点间的距离  用的开方函数sq ...

【jmeter】JMeter处理Cookie与Session

有些网站保存信息是使用Cookie,有些则是使用Session.对于这两种方式,JMeter都给予一定的支持. 1.Cookie 添加方式:线程组-配置元件-HTTP Cookie 管理器,如下图: ...

lucene、lucene&period;NET详细使用与优化详解

lucene.lucene.NET详细使用与优化详解 2010-02-01 13:51:11 分类: Linux 1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应 ...

学习pthreads,使用互斥量进行同步

在进行多线程编程时,我们总会遇到全局变量和数据结构的问题,这是多线程之间进行通信的问题.如果多个线程同时读写一个全局变量,那么会造成竞争或者出错.为了解决这一问题,我们需要对全局数据进行,使用互斥量实 ...

redis缓存数据库

redis 介绍 redis是业界主流的key-value nosql 数据库之一.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set( ...

POJ 2923 Relocation 装车问题 【状态压缩DP】&plus;【01背包】

题目链接:https://vjudge.net/contest/103424#problem/I 转载于:>>>大牛博客 题目大意: 有 n 个货物,并且知道了每个货物的重量,每次用 ...

JFreeChart工具类

需要的jar包: jfreechart-1.0.17.jarjcommon-1.0.24.jar (jfreechart一般只要1.0系列的都可以,jcommon一般任何版本都可以) 效果: 代码: ...

linux install jupyter notebook

install sudo pip install jupyter notebook start sudo jupyter notebook 一般,文件目录默认在你启动的位置.你可以在notebook里 ...

Linux管道的原子性,管道的原子性 linux写操作原子性相关推荐

  1. Linux管道的原子性,管道机制

    管道指的是从一个进程连接数据流到另一个进程.它具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): 单 ...

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

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

  3. Linux中的pipe(管道)与named pipe(FIFO 命名管道)

    catalogue 1. pipe匿名管道 2. named pipe(FIFO)有名管道 1. pipe匿名管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入 ...

  4. linux系统调用创建无名管道,无名管道系统调用

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道 1.管道创建与关闭说明 管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1],其中fd ...

  5. linux无名管道和有名管道

    1)无名管道:管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道:只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程). 单独构成一种独立的文件系统:管道对于管道两端的进程而 ...

  6. 17、有名管道与无名管道之间的区别

    1)无名管道:管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道:只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程). 单独构成一种独立的文件系统:管道对于管道两端的进程而 ...

  7. 有名管道和无名管道的区别

    1)无名管道:管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道:只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程). 单独构成一种独立的文件系统:管道对于管道两端的进程而 ...

  8. 【Java 并发编程】线程操作原子性问题 ( 问题业务场景分析 | 使用 synchronized 解决线程原子性问题 )

    文章目录 总结 一.原子性问题示例 二.线程操作原子性问题分析 三.使用 synchronized 解决线程原子性问题 总结 原子操作问题 : 线程中 , 对变量副本 count 进行自增操作 , 不 ...

  9. 管道半双工通信程序linux,Linux进程间通信的几种方法-半双工管道,命名管道,消息队列...

    1.半双工管道 简单实现 半双工管道可以实现父进程和子进程之间或者子进程之间(前提是有共同的祖先)的通信 因为是半双工,所以两端不可能同时读取,而是一端读一端取,而且当一端分配到读任务后,那么他就固定 ...

最新文章

  1. jQuery就业课系列之.jQueryDOM
  2. JavaParser生成,分析和修改Java代码
  3. 关于解决工作中的自动化环境搭建的解决方案(序)
  4. JAVA写同步栈_tomcat实现的同步队列和同步栈
  5. PHP使用http_build_query()构造URL字符串的方法(可将POST参数组转换拼接成GET请求链接)...
  6. 迅为4412开发板开发笔记--开发板与主机和ubuntu的ping通
  7. 概率论概念及机器学习中样本相似性度量之马氏距离
  8. ucos-II之就绪表解读
  9. WebStrom如何创建项目,为什么我开始选择HTML5到自定义路径报错
  10. 计算机管理中无法格式化,Win7电脑无法格式化SD卡怎么办?
  11. 几何分布的期望和方差公式推导_学习笔记:几种特殊分布之间的关系
  12. JavaScript实现节点的增加修改删除查找
  13. Python学习笔记-系统性能信息模块psutil
  14. 节点操作之父子节点和下拉框
  15. 2022年数学类保研经验整理(信息与计算科学、计算数学、计算机)
  16. cv2.boundingRect
  17. 元宇宙,只是一时兴起的想法?
  18. matplotlib cm.coolwarm报错 解决方法
  19. Windos 系统安装 Themebeta Chrome主题
  20. 计算机网络学习笔记(一) 计算机网络及互联网 Chapter1-Computer NetWorks and the Internet

热门文章

  1. ecshop上传图片2
  2. 读书笔记--Head First C#目录
  3. 2010年3月再谈前端工程师的笔试题
  4. 企业管理软件解决方案 出售 :针对华东区中小企业订单仓储管理流程
  5. 55天 - 算法 - 动态规划 - 数组类 从前往后
  6. 实现一个顺序表的建立、查找、插入和删除操作【数据结构实验报告】
  7. winformbutton边框怎么改_C#(winform)为button添加背景图片,并去掉各种边框
  8. Python使用正则表达式检查合法IP地址
  9. Python+turtle交互式绘图:可以用鼠标拖动的小海龟
  10. 力扣235. 二叉搜索树的最近公共祖先(JavaScript)