首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF

/code/linux_programming/APUE/pipe$ ....五、当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性;当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。...68k,即每个子进程完全写入68k才返回,而父进程管道进行阻塞读取,每次读取4k,打印每4k中的最后一个字符,如果没有数据到达就阻塞等待,如果管道剩余数据不足4k,read 很可能返回 < 4k,但因为我们写入...可以得出结论:当多个进程管道进行写入,且一次性写入数据量大于PIPE_BUF时,则不能保证写入的原子性,即可能数据是穿插着的。...管道的前4种读写规则具有普遍意义,Tcp socket 也具有管道的这些特性。 参考:《APUE》

3K90
您找到你想要的搜索结果了吗?
是的
没有找到

LINUX一些面试问题集合

事实上,即使在用户空间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是读写操作,都是硬件(存储器)的操作,都必然会引起系统调用。...总之,只要掌握I2C的忽悠记,一般很容易掌控... 第一个字节(为slave address)由7位地址和一位R/W读写位组成的,这字节是个器件地址。...Linux 内核中的同步机制:原子操作、信号量、读写信号量和自旋锁的API,另外一些同步机制,包括大内核锁、读写锁、大读者锁、RCU (Read-Copy Update,顾名思义就是读-拷贝修改),和顺序锁...在Linux内核环境下,申请大块内存的成功率随着系统运行时间的增加而减少,虽然可以通过vmalloc系列调用申请物理不连续但虚拟地址连续的内存,但毕竟其使用效率不高且在32位系统上vmalloc的内存地址空间有限...1)管道Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信 2)命名管道named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外

1.1K21

Linux系统面试题

Linux 的体系结构从大的方面讲,Linux 体系结构可以分为两块:用户空间(User Space) :用户空间又包括用户的应用程序(User Applications)、C 库(C Library)...读写锁:读写锁也叫共享互斥锁:读模式共享和写模式互斥,本质上这种非常合理,因为在数据没有被写的前提下,多个使用者读取时完全不需要加锁的。...vmalloc 用于申请大块内存,虚拟地址连续,物理地址不一定连续,不能直接用于DMA,在进程地址空间有专门的一块。对应释放函数 vfree()。...物理地址和虚拟地址都连续,可用于DMA操作。6. Linux 内核空间布局x86架构中将内核地址空间划分三部分:ZONE_DMA、ZONE_NORMAL和 ZONE_HIGHMEM。...管道:两个进程需要有共同的祖先,pipe/popen 命名管道:两个进程可以无关 信号 消息队列 共享内存 信号量 套接字8. 伙伴系统申请内存的函数有哪些?

1.6K44

linux 进程通信-管道(pipe)《Rice linux 学习开发》

Pipe概述 管道Linux中进程间通信的一种方式,它分为三种:无名管道,标准流管道,有名管道。...它可以看做一中特殊的文件,它的读写可以使用read()和write()等函数,但是它不属于普通的文件,并不属于其他任何的文件系统,并且只存在与内核空间中 管道是机遇文件描述符的通信方式...实际上,通常先是创建一个管道,再通过fork()函数创建一子进程,该子进程会继承父进程的所创建的管道 父子进程分别拥有自己的读写通道,为了实现父子进程之间的读写,只需把无关的读端或写端的文件描述符关闭即可...它可以使互不相关的两个进程彼此通信, FIFO是严格的遵循先进先出规则,管道及FIFO的读总是从开始处返回数据,他们的写则把数据添加到末尾,他们不支持如lseek()等文件定位操作 有名管道的穿件可以使用函数...,则读操作进行部分写入或者调用失败 例程 通道例程中,提供了有名管道的读例程和写例程,例程请参考我github的pipe目录下的read.c和write.c

1.6K20

聊聊零拷贝

可以参看异步 IO 两种实现的介绍: POSIX AIO -- glibc 版本异步 IO 简介 linux AIO -- libaio 实现的异步 IO 简介及实现原理 在追求高性能的数据库、web...内存映射 IO -- mmap 此前我们 linux 下的内存映射 IO 的用法做过详细的介绍。 那么,内存映射 IO 究竟是如何实现的呢?...4.1 mmap 的执行流程 用户进程执行 mmap 函数后,会在内存虚拟地址空间中分配一段连续的地址空间; 当用户进行文件操作时,会触发一个特殊的缺页中断; 内核发起调页请求,将数据从磁盘写入到内存中...我们知道,进程间通信的一个高效的方法就是通过管道 pipe,所谓的“管道”实际上是一个 FIFO 缓冲区,这个缓冲区的存在实现了位于管道两端的两个进程之间的高效通信。...splice 借鉴了管道的设计思想,它在通信的两端之间创建了一个中间缓冲区,让两端在这个 FIFO 缓冲区中直接进行读写,从而实现性能的提升。

47221

Linux匿名管道及实例

匿名管道,也称管道,是Linux下最常见的进程间通信方式之一。匿名管道在系统中没有实名,它只是进程的一种资源,会随着进程的结束而被系统清除。...进程间管道读写 单独一个进程进行管道读写是没有实际意义的,管道的应用体现在父子进程或兄弟进程之间的通信。...父子进程间管道读写 父进程利用管道向子进程发送消息,使用pipe函数建立管道,使用fork函数创建子进程,在父进程中维护管道的数据方向,并在父进程中向子进程发送消息,parent_pipe_child.c...兄弟进程间管道读写 管道在兄弟进程间传递数据,brother_pipe.c: #include #include #include #include...参考:《精通Linux C编程》- 程国钢 附:fork()函数的使用示例,参考:https://blog.csdn.net/jason314/article/details/5640969 #include

2.3K30

【Java基本功】浅析Java中IO流的概念和用法

流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。...各类用途汇总如下: 文件访问 网络访问 内存缓存访问 线程内部通信(管道) 缓冲 过滤 解析 读写文本 (Readers / Writers) 读写基本类型数据 (long, int etc.)...流和数组不一样,不能通过索引读写数据。在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAccessFile 处理文件。流仅仅只是一个连续的数据流。...所以管道也可以作为数据源以及目标媒介。 你不能利用管道与不同的JVM中的线程通信(不同的进程)。在概念上,Java的管道不同于Unix/Linux系统中的管道。...在Unix/Linux中,运行在不同地址空间的两个进程可以通过管道通信。在Java中,通信的双方应该是运行在同一进程中的不同线程。

44220

Java基础17:Java IO流总结

流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。...各类用途汇总如下: 文件访问 网络访问 内存缓存访问 线程内部通信(管道) 缓冲 过滤 解析 读写文本 (Readers / Writers) 读写基本类型数据 (long, int etc.)...流和数组不一样,不能通过索引读写数据。在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAccessFile 处理文件。流仅仅只是一个连续的数据流。...所以管道也可以作为数据源以及目标媒介。 你不能利用管道与不同的JVM中的线程通信(不同的进程)。在概念上,Java的管道不同于Unix/Linux系统中的管道。...在Unix/Linux中,运行在不同地址空间的两个进程可以通过管道通信。在Java中,通信的双方应该是运行在同一进程中的不同线程。

96100

Linux 的进程间通信:管道

,并且管道写了一个字符串之后从管道读取,并打印在标准输出上。...利用这个特性,父进程先pipe创建管道之后,子进程也会得到同一个管道读写文件描述符。从而实现了父子两个进程使用一个管道可以完成半双工通信。...使用同一个管道的父子进程可以分时给对方发送消息。我们也可以看到管道读写的一些特点,即: 在管道中没有数据的情况下,管道的读操作会阻塞,直到管道内有数据为止。...POSIX标准中,PIPEBUF有长度限制,要求其最小长度不得低于512字节。PIPEBUF的作用是,内核在处理管道的时候,如果每次读写操作的数据长度不大于PIPEBUF时,保证其操作是原子的。...在这之后,Linux重新实现了一个管道缓存,并将它与写操作的PIPEBUF实现成了不同的概念,形成了一个默认长度为65536字节的PIPESIZE,而PIPEBUF只影响相关读写操作的原子性。

8.2K21

夯实Java基础系列16:一文读懂Java IO流和常见面试题

流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。...各类用途汇总如下: 文件访问 网络访问 内存缓存访问 线程内部通信(管道) 缓冲 过滤 解析 读写文本 (Readers / Writers) 读写基本类型数据 (long, int etc.)...流和数组不一样,不能通过索引读写数据。在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAccessFile 处理文件。流仅仅只是一个连续的数据流。...所以管道也可以作为数据源以及目标媒介。 你不能利用管道与不同的JVM中的线程通信(不同的进程)。在概念上,Java的管道不同于Unix/Linux系统中的管道。...在Unix/Linux中,运行在不同地址空间的两个进程可以通过管道通信。在Java中,通信的双方应该是运行在同一进程中的不同线程。

1.3K21

socket常用函数_socket recv函数

摘要 在linux下,使用socketpair函数能够创建一套节字进行进程间通信(IPC)。...SOCK_STREAM是基于TCP的,而SOCK_DGRAM是基于UDP的 参数3(protocol):表示类型,只能为0 参数4(sv[2]):套节字柄,该两个句柄作用相同,均能进行读写双向操作...EOPNOTSUPP:指定的协议不支持创建套接字。 EPROTONOSUPPORT:本机不支持指定的协议。 注意: 1、该函数只能用于UNIX域(LINUX)下。...3、所创建的套节字作用是一样的,均能够可读可写(而管道PIPE只能进行单向读或写)。 4、在读的时候,管道内必须有内容,否则将会阻塞;简而言之,该函数是阻塞的。...相关代码 /*socketpair1.c*/ #include #include #include #include <stdio.h

1.4K20

Linux进程间通信——匿名管道

后来他们改造了B语言,就形成了今天大名鼎鼎的C语言。这个自发明到现在这个物联网时代仍占据编程语言榜前10的稳固位置。不得不感叹其生命力的强大以及适应性的强大。...最初的Unix的IPC包括,管道,FIFO,信号。贝尔实验室Unix早期的进程通信进行了改进,形成了system V这个操作系统的IPC。...Linux进程通信方式: 管道管道(pipe)分为无名管道和有名管道。无名管道用于具有亲缘关系进程间的通信,有名管道则可以在任意的进程中间进行通信。 管道通信具有以下的特点: 管道是半双工的。...(双向通信的,但是不能同时向双方传输) 只能用于父子进程或者是兄弟进程之间(就是要具有亲缘关系) 管道是一种文件(能读写),它只存在于内存之中。他是具有亲缘关系的进程共享的。...,最好是严格遵守文件的读写规则,在使用完毕后一定要关闭文件。

1.4K10

夯实Java基础系列16:一文读懂Java IO流和常见面试题

流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。...各类用途汇总如下: 文件访问 网络访问 内存缓存访问 线程内部通信(管道) 缓冲 过滤 解析 读写文本 (Readers / Writers) 读写基本类型数据 (long, int etc.)...流和数组不一样,不能通过索引读写数据。在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAccessFile 处理文件。流仅仅只是一个连续的数据流。...所以管道也可以作为数据源以及目标媒介。 你不能利用管道与不同的JVM中的线程通信(不同的进程)。在概念上,Java的管道不同于Unix/Linux系统中的管道。...在Unix/Linux中,运行在不同地址空间的两个进程可以通过管道通信。在Java中,通信的双方应该是运行在同一进程中的不同线程。

50110

六.Linux管道及重定向

Linux管道及重定向 shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制。在shell中,我们通常使用符合‘|’来表示管道,符号‘>’和‘<’表示重定向。...例如命令ls | grep main.c,使用了管道来连接了两条命令来执行,能够快速地让我们知道当前目录下是否有 main.c 文件。 管道的本质是内存中的缓冲区,可以看作是打开到内存中的文件。...至此管道就算创建成功了。 把管道作为标准输入输出 管道创建成功后,就可以直接使用 read()和 write()函数管道进行数据的读写。...而因为shell中都是使用标准输入输出管道进行读写的,例如ls | grep main.c就是将 ls 的标准输出写到了管道写端,而 grep 的标准输入则从管道读端读取,所以本文也只描述此方法。...如果我们希望在子进程中执行管道的读端的程序例如ls | grep main.c中的grep main.c;在父进程中执行管道的写端的程序,例如ls | grep main.c中的ls。

2.3K20

Linux进程间通信【匿名管道

,很多类 Unix 系统也在支持兼容这个标准,如 Linux , POSIX 标准具有跨平台性,就连 Windows 也其进行了支持,后续学习 同步与互斥 时,所使用的信号量等都是出自 POSIX 标准...管道 的使用和 文件 一致,迎合 Linux一切皆文件思想 4.3、管道读写规则 管道是一种 半双工、单向流 的通信方式,因此在成功创建匿名管道后,需要两个待通信的进程都能获得同一个 pipefd 数组...作出不同的动作,当 flags 为 0 时,pipe2 等价于 pipe 管道读写规则: PIPE_BUF 为管道大小,Linux 中为 4096 字节 当要写入的数据量不大于 PIPE_BUF...,写入 与 读取 的次数并不是严格匹配的,此时读写次数没有强相关关系,管道是面向字节流读写的 面向字节流读写又称为 流式服务:数据没有明确的分割,不分一定的报文段;与之相对应的是 数据报服务:数据有明确的分割...i386 平台中,管道大小为 4096 字节,即 4kb),从 Linux 2.6.11 开始,管道大小的容量统一为 65536 字节,即 64kb 因为在 Linux 2.6.11 版本中,管道进行更新

18620

又被百度捞起来了,能赢吗?

答: 首先是匿名管道,但是有个缺点,所有文件都共享,并且取/写只能一个操作; 紧接着是命名管道,可以用于两个指定文件间进行同步; 然后是信号量,我认为信号量和锁类似,通过信号量,进程之间进行间接通信;信号和信号量相类似...还有互斥锁、读写锁、自选锁 C++ C++特性介绍一下? 答:讲了封装继承多态....这时候用sizeof这个类计算一下,得到的是多少? 答:1 为什么呢? 答:我就说了C++是固定地址的,如果是0的话,调用的时候会有地址冲突。 说到这个sizeof,你觉得它是函数吗?...答:一个内存空间是不连续的,一个是段连续的。 那么deque是不是可以用list去实现呢? 答:我认为是的 计算机网络 如果要实现一个TCP服务器要哪些(套接字)接口?...I/O活动:关注系统的磁盘I/O活动情况,包括磁盘的读写速度、等待时间等,可以通过查看磁盘相关的统计信息来了解。 那你常用的linux命令 可以自己说一说?

6310
领券