simba@ubuntu:~/Documents/code/linux_programming/APUE/pipe$ ...., buf, 10); printf("ret = %d\n", ret); return 0; } 输出测试如下: simba@ubuntu:~/Documents/code/linux_programming...五、当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性;当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。...On Linux, PIPE_BUF is 4096 bytes。 ...可以得出结论:当多个进程对管道进行写入,且一次性写入数据量大于PIPE_BUF时,则不能保证写入的原子性,即可能数据是穿插着的。
这就不得不提Linux的的前身Unix。因为Linux一开始就是从这儿借鉴的。加上Linux从一开始就遵守POSIX标准。...Linux继承了这些。.../limits.h> //这个头文件中有PIPE_BUF int main() { int filedes[2]; //保存管道文件的文件描述符 char...管道文件的大小由PIPE_BUF描述。它在#include这个头文件中给出。...#define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */ 向管道写入数据的时候Linux不保证写入的原子性,管道缓冲区一有空闲
PIPE_BUF定义了管道可原子写入的数据量,在我的系统(CentOS 6.7)上这个值是4096,写了个程序验证了一下,通过三个维度来考察: N: 生产者数量 M:每个生产者的生产次数 P:每次写入的块数...(每块大小为PIPE_BUF) 实验发现,当P<=2时,无论如何提升N与M,都很难检测到(自己没检测到)数据穿插的现象; 而当P提升到3时,N与M很小就可以检测到数据穿插。...所以这里有一个疑问:底层的PIPE原子写入的数据量是不是2 * PIPE_BUF ? 否则如何解释上面的现象。 测试代码
对于管道而言是不可能的 5.管道和FIFO的额外属性 下面是管道或者FIFO的读出与写入的若干额外规则: (1)如果请求读出的数据量多余管道或者FIFO的可用数据量,那么只返回可用数据量 (2)如果请求的数据字节小于等于PIPE_BUF...(3)O_NONBLOCK标志的设置对于write操作的原子性没有影响——原子性完全由所请求的字节数是否小于等于PIPE_BUF决定的。...如果待写字节数小于等于PIPE_BUF: (i)如果空间足够则写入 (ii)如果空间不足,那么立即返回EAGAIN 如果待写字节数大于PIPE_BUF: ...每次连接一个记录:应用通过关闭与其对方的连接来指示一个记录的结束 7.管道和FIFO限制 系统加于管道和FIFO的唯一限制为 OPEN_MAX 一个进程在任意时刻打开的最大描述字数(至少16) PIPE_BUF
匿名管道,也称管道,是Linux下最常见的进程间通信方式之一。匿名管道在系统中没有实名,它只是进程的一种资源,会随着进程的结束而被系统清除。...管道的创建与关闭 Linux中使用pipe()函数创建一个匿名管道,其函数原型为: #include int pipe(int fd[2]); 创建成功返回0,出错返回1。...stdio.h> #include #include #include #include #define BUFSIZE PIPE_BUF...stdio.h> #include #include #include #include #define BUFSIZE PIPE_BUF...参考:《精通Linux C编程》- 程国钢 附:fork()函数的使用示例,参考:https://blog.csdn.net/jason314/article/details/5640969 #include
微博ID:orroz 微信公众号:Linux系统技术 前言 管道是UNIX环境中历史最悠久的进程间通信方式。本文主要说明在Linux环境上如何使用管道。...所以,Linux上的管道就是一个操作方式为文件的内存缓冲区。 管道的分类和使用 Linux上的管道分两种类型: 匿名管道 命名管道 这两种管道也叫做有名或无名管道。...O_NONBLOCK打开,n <= PIPE_BUF: 如果有足够的空间存放n字节长度,write调用会立即返回成功,并且对数据进行写操作。...O_NONBLOCK关闭,n > PIPE_BUF: 对n字节的写入操作不保证是原子的,就是说这次写入操作的数据可能会跟其他进程写这个管道的数据进行交叉。...O_NONBLOCK打开,n > PIPE_BUF: 如果管道空间已满。write调用报错返回并且errno被设置为EAGAIN。
如果所有管道写端对应的文件描述符被关闭,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出 当要写.入的数据量不.大于PIPE_BUF...时,linux将保证写.入的原.子性。...当要写.入的数据量.大于PIPE_BUF时,linux将不再保证写.入的原.子性。
EAGAIN 如果所有管道写端对应的文件描述符被关闭,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出 当要写入的数据量不大于PIPE_BUF...时,linux将保证写入的原子性。...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。
相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务。...errno值为EAGAIN 3.如果所有管道写端对应的文件描述符被关闭,则read返回0 4.如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 5.当要写入的数据量不大于PIPE_BUF...时,linux将保证写入的原子性。...6.当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。
豌豆贴心提醒,本文阅读时间5分钟 相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务。...errno值为EAGAIN 3.如果所有管道写端对应的文件描述符被关闭,则read返回0 4.如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 5.当要写入的数据量不大于PIPE_BUF...时,linux将保证写入的原子性。...6.当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。
fcntl.h> #include #include #include #include #define BUFES PIPE_BUF...stdio.h> #include #include #include #include #define BUFES PIPE_BUF...// close the fifo close(fd); exit(0); } 该程序首先调用open()函数打开FIFO,之后通过read()函数循环读取FIFO的内容,每次读取PIPE_BUF
管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道。...由于Linux中所有的事物都可被视为文件,所以对命名管道的使用也就变得与文件操作非常的统一,也使它的使用非常方便,同时我们也可以像平常的文件名一样在命令中使用。...my_fifo"; int pipe_fd = -1; int res = 0; int open_mode = O_RDONLY; char buffer[PIPE_BUF...= -1) { //读取FIFO中的数据 res = read(pipe_fd, buffer, PIPE_BUF); bytes_read
相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务.就好像下面的命令: echo 123 | awk '{print $0+...调用返回-1,errno值为EAGAIN 如果所有管道写端对应的文件描述符被关闭,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 当要写入的数据量不大于PIPE_BUF...时,linux将保证写入的原子性。...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。
相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务.就好像下面的命令: echo 123 | awk '{print $0+123...-1,errno值为EAGAIN 如果所有管道写端对应的文件描述符被关闭,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 当要写入的数据量不大于PIPE_BUF...时,linux将保证写入的原子性。...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。
环境:CentOS 6.7 分别使用上述两种方法,测得管道容量: 1) 3112948 字节 (<3MB) 2)8527860 字节 (<8MB) 首先说明一下,系统定义的PIPE_BUF(4096)表示可以一次写入的最大原子数据量
我们也可以读一下管道的手册: 如上,也就是说从 Linux 2.6.11 内核之后管道的大小就变成了 64KB;我们接着看: 我们可以看到有一个 PIPE_BUF 的东西,其实它就是单次向管道中写入的大小...所以管道在保证读取的原子性,它规定 PIPE_BUF 的大小,只要是父进程或子进程读写的单位是小于 PIPE_BUF 的,它们读写的过程就是原子的,也就是说当子进程写入的数据小于 PIPE_BUF,父进程也不会来读取的...,这就是 PIPE_BUF 的本质,所以我们在 ulimit 中查到的管道大小我们可以理解成 PIPE_BUF 的大小。
Linux 文件系统 目录 说明 bin 存放二进制可执行文件 sbin 存放二进制可执行文件,只有 root 才能访问 boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc...是超级管理员 localhost 表示主机名 ~ 表示当前目录(家目录),其中超级管理员家目录为 /root,普通用户家目录为 /home/chan $ 表示普通用户提示符,# 表示超级管理员提示符 Linux...test.tar.gz 文件搜索命令 locate:在后台数据库搜索文件 updatedb:更新后台数据库 whereis:搜索系统命令所在位置 which:搜索命令所在路径及别名 find:搜索文件或文件夹 用户和组 Linux
如果所有管道写端对应的文件描述符被关闭,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出 当要写入的数据量不大于PIPE_BUF...时,linux将保证写入的原子性。...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。
管道的定义: 管道是一种进程间通信机制,也是Linux操作系统中的一种文件形式。一个进程写入管道的数据可以被另一个进程读取。数据按先进先出顺序处理。Linux有两种形式的管道文件,管道和FIFO。...rfd); } unlink(fn); } } *为了保证进程访问管道和FIFO的原子性,需要对管道和FIFO加以限制: OPEN_MAX: 一个进程在任意时刻打开的最大描述符数 PIPE_BUF
进程的 PPID 一致,同时 PID 连续,因此这两个进程是兄弟关系 管道分为 匿名管道 和 命名管道,两者绝大部分原理、特点都一致,本文主要介绍 匿名管道,同时适用于 命名管道 的知识点统一称为 管道 Linux...管道 的使用和 文件 一致,迎合 Linux一切皆文件思想 4.3、管道读写规则 管道是一种 半双工、单向流 的通信方式,因此在成功创建匿名管道后,需要两个待通信的进程都能获得同一个 pipefd 数组...关于匿名管道还有一个函数:pipe2 (了解),比 pipe 函数多一个参数2 flags,可以使匿名管道在发生特殊情况时,作出不同的动作,当 flags 为 0 时,pipe2 等价于 pipe 管道的读写规则: PIPE_BUF...为管道大小,Linux 中为 4096 字节 当要写入的数据量不大于 PIPE_BUF 时,Linux 将保证写入的原子性 当要写入的数据量大于 PIPE_BUF 时,Linux 将不再保证写入的原子性...i386 平台中,管道大小为 4096 字节,即 4kb),从 Linux 2.6.11 开始,管道大小的容量统一为 65536 字节,即 64kb 因为在 Linux 2.6.11 版本中,对管道进行更新
领取专属 10元无门槛券
手把手带您无忧上云