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描述。它在#includelinux/limits.h>这个头文件中给出。...#define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */ 向管道写入数据的时候Linux不保证写入的原子性,管道缓冲区一有空闲
对于管道而言是不可能的 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
PIPE_BUF定义了管道可原子写入的数据量,在我的系统(CentOS 6.7)上这个值是4096,写了个程序验证了一下,通过三个维度来考察: N: 生产者数量 M:每个生产者的生产次数 P:每次写入的块数...(每块大小为PIPE_BUF) 实验发现,当P<=2时,无论如何提升N与M,都很难检测到(自己没检测到)数据穿插的现象; 而当P提升到3时,N与M很小就可以检测到数据穿插。...所以这里有一个疑问:底层的PIPE原子写入的数据量是不是2 * 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将不再保证写.入的原.子性。
管道的使用和文件一致,迎合了"Linux一切皆文件思想"。...当要写入的数据量不大于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将不再保证写入的原子性。
相信很多在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将不再保证写入的原子性。
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
环境:CentOS 6.7 分别使用上述两种方法,测得管道容量: 1) 3112948 字节 (<3MB) 2)8527860 字节 (<8MB) 首先说明一下,系统定义的PIPE_BUF(4096)表示可以一次写入的最大原子数据量
今日更新了Linux进程间通信的内容 欢迎大家关注点赞收藏⭐️留言 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。...(写的次数和读取的次数不是一一匹配的) 管道的通信模式,是一种特殊的半双工模式,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。 原子的意思就是这次的写入操作不会被中断。写的时候,不会写一半就被读走。在读方看来,要么不写,要么写完了。
我们也可以读一下管道的手册: 如上,也就是说从 Linux 2.6.11 内核之后管道的大小就变成了 64KB;我们接着看: 我们可以看到有一个 PIPE_BUF 的东西,其实它就是单次向管道中写入的大小...所以管道在保证读取的原子性,它规定 PIPE_BUF 的大小,只要是父进程或子进程读写的单位是小于 PIPE_BUF 的,它们读写的过程就是原子的,也就是说当子进程写入的数据小于 PIPE_BUF,父进程也不会来读取的...,这就是 PIPE_BUF 的本质,所以我们在 ulimit 中查到的管道大小我们可以理解成 PIPE_BUF 的大小。
在Linux中使用管道 首先,学过Linux命令的话,大家对于管道肯定不陌生, Linux管道使用竖线 | 连接多个命令,这个被称为管道符。...0x7F) <<endl; //用完把读端也关掉 close(pipefd[0]); return 0; } tips: 当要写入的数据量不大于PIPE_BUF...时,linux将保证写入的原子性 当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性 管道特点 管道的特点: 只能用于具有共同祖先的进程(具有亲缘关系的进程)
在Linux系统中,采用了两级保护机制,其中0级为内核使用,3级为用户程序使用。每个进程都拥有自己的私有用户空间(0~3G),这个空间对其他进程是不可见的。...include #include #define MYFIFO "/tmp/myfifo"/* 有名管道文件名*/ #define MAX_BUFFER_SIZE PIPE_BUF.../*常量PIPE_BUF 定义在于limits.h中*/ int main() { char buff[MAX_BUFFER_SIZE]; int fd; int nread...include #include #define MYFIFO "/tmp/myfifo"/* 有名管道文件名*/ #define MAX_BUFFER_SIZE PIPE_BUF.../*常量PIPE_BUF 定义在于limits.h中*/ int main() { char buff[MAX_BUFFER_SIZE]; int fd; int nread
领取专属 10元无门槛券
手把手带您无忧上云