Linux 管道对阻塞之前一次写操作的大小有限制。 专门为每个管道所使用的内核级缓冲区确切为 4096 字节。 除非阅读器清空管道,否则一次超过 4K 的写操作将被阻塞。 实际上这算不上什么限制,因为读和写操作是在不同的线程中实现的。

Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较 Linux 的命名管道和 Windows 的命名管道。我写了另一个在 Linux 上使用命名管道的程序。我发现对于 Linux 上命名的和未命名的管道,结果是没有区别。

Linux 管道比 Windows 2000 命名管道快很多,而 Windows 2000 命名管道比 Windows XP 命名管道快得多。

例子:

#include

#include

int main()

{

int n,fd[2]; // 这里的fd是文件描述符的数组,用于创建管道做准备的

pid_t pid;

char line[100];

if(pipe(fd)<0) // 创建管道

printf("pipe create error\n");

if((pid=fork())<0) //利用fork()创建新进程

printf("fork error\n");

else if(pid>0){ //这里是父进程,先关闭管道的读出端,然后在管道的写端写入“hello world"

close(fd[0]);

write(fd[1],"hello word\n",11);

}

else{

close(fd[1]); //这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据

n= read(fd[0],line,100);

write(STDOUT_FILENO,line,n);

}

exit(0);

}

总结:管道分为无名管道和有名管道,其中无名管道不属于任何文件系统,只存在于内存中,它是无名无形的,但是可以把它看作一种特殊的文件,通过使用普通文件的read(),write()函数对管道进行操作,

有名管道是有名有形的,为了使用这种管道,LINUX中设立了一个专门的特殊文件系统--管道文件,它存在于文件系统中,任何进程可以在任何时候通过有名管道的路径和文件名来访问管道。但是在磁盘上的只是一个节点,而文件的数据则只存在于内存缓冲页面中,与普通管道一样。

pipe是Linux中最经典的进程间通信手段,在终端里通常用来组合命令,例如“ls -l|wc -l”。它的作用很直观,就是使得前一个进程的输出作为后一个进程的输入,在概念上很符合“管道”的意思。

用管道实现“ls -l | wc -l“

《情景分析》上有这个例子的代码,我觉得很适合用来了解管道。这里假设终端对应的进程为PA,wc、ls是PA先后创建的两个子进程child_B与child_C。代码简化后抄录如下:

int main(){

int pipefds[2], child_B, child_C;

pipe(pipefds);

if (!(child_B=fork()){ //先创建“读”的一端,它要关闭“写”的的一端

close(pipefds[1]);

close(0);

dup2(pipefds[0], 0); //在执行系统调用execve后,child_B会释放0,1,2之外由父进程打开的文件,

close(pipefds[0]); //所以要把pipefds[0]复制到标准输入对应的文件句柄0

execl("/usr/bin/wc", "-l", NULL);

} //这里之后,A和B可以通过管道进行通信

close(pipefds[0]);

if (!(child_C=fork()){ //再创建“写”的一端,它要关闭“读”的的一端

close(1);

dup2(pipefds[1],1); //道理同前面

close(pipefds[1]);

execl("/bin/ls", "-1", NULL);

} //这里之后,B和C可以通过管道进行通信

close(pipefds[1]);

wait4(child_B, NULL, 0, NULL);

return 0;

}

linux有名管道大小,Linux中的pipe与named pipe(FIFO),即管道和命名管道相关推荐

  1. linux C语言mkfifo()函数 mkfifoat()函数(制作一个 FIFO 特殊文件(命名管道))

    文章目录 man 3 mkfifo 20220605 示例 man 3 mkfifo MKFIFO(3) Linux Programmer's Manual MKFIFO(3)NAMEmkfifo, ...

  2. linux 直接映射 页表大小,linux 启动过程临时页表到底映射了多大内存?

    从linux-2.4内核开始,在建立临时页表的时候,一般的教科书都说是映射了8M的物理内存,但是为什么是映射8M呢?当时网上有资料说,8M足够了,但为什么就足够了,一直没有彻底搞清楚,今天又重新分析这 ...

  3. linux df 目录大小,Linux命令du df查看文件和文件夹大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. du可以查看文件及文件夹的大小. 两者配 ...

  4. linux zip压缩包大小,Linux中巧用zip命令压缩和解压缩文件

    在Windows中,我们用得最多的解压缩软件就是WinRAR了,这个软件对我们实现解压缩非常方便.但是如果在Linux系统中,我们还可以尝试用命令来实现对文件的解压缩,这篇文章主要介绍在Linux中用 ...

  5. linux 增加shm 大小,Linux系统中如何修改及限制shm的大小

    在天下网吧-网吧系统-网吧天下栏目上一篇文章中,我们看到了:希望对各位网吧网管或者网吧维护,做网吧系统的各位大大有用,那么今天我们一起来看下:Linux系统中如何修改及限制shm的大小 前面的一篇文章 ...

  6. linux mount挂载大小,Linux中mount挂载问题小结

    vfat文件编码方式 fat32文件名分为两种,短文件名和长文件名,两种文件名在磁盘上的存储方式是不同的,长文件名在目录项中特殊的标记,短文件名也就是8.3格式,对于包含中文的任何文件来说都不可能是短 ...

  7. linux rps值大小,Linux系统中RPS/RFS介绍

    frankzfz2014-07-27 17:32 demo121:frankzfz您好: 我想请教一个问题,就是将写好的GenericApp项目(没有配置工具),我加入zigbee协议栈的配置工具后还 ...

  8. linux逻辑盘大小,linux – 物理和逻辑盘区大小

    我在rhel 6.6中创建了一个36TB(/ dev / sdb1)的分区 现在我想用这个用于lvm 物理范围,批量扩展和逻辑范围的建议大小是多少 在创建时定义PE,VE和LE大小有多重要? 我想创建 ...

  9. linux 增加lv大小,Linux增加LV(逻辑卷)容量

    Linux增加LV(逻辑卷)容量 2017-09-29-17:34:13 个人原创博客,转载请注明出处. 查看逻辑卷的相关命令: lvs vgs 命令: VG #PV #LV #SN Attr VSi ...

最新文章

  1. msp430入门学习16
  2. 深浅拷贝、函数、内置函数、文件处理、三元运算、递归
  3. SpringBoot停车场管理系统(附源码)
  4. lync服务器不响应或无法联系,Lync 用户无法与外部联系人通信 - Skype for Business | Microsoft Docs...
  5. 怎么才能学好Java编程写好Java代码?
  6. C++描述杭电OJ 2015.偶数求和 ||
  7. 【校招面试 之 网络】第3题 HTTP请求行、请求头、请求体详解
  8. C++中 #define的用法
  9. php数据库find(),db_find()
  10. JNI读取assets资源文件
  11. 已经学过51单片机,如何进阶?我来教你
  12. 体育类App原型制作分享-Onefootball
  13. MySQL 中的 repeate() 函数
  14. java flv 转swf_nginx-http-flv-module flv拉流错误整理
  15. 交通信息工程 实验三:交通信号机仿真实验
  16. 数商云制药医药供应链erp管理系统解决方案
  17. 运维派 企业面试题6 防dos攻击
  18. android apk上架流程,Android apk上架国内应用市场流程
  19. Q版京剧脸谱来喽——武生
  20. 软件开发的12大定律,你是否使用了呢

热门文章

  1. 采用docker安装部署Nginx
  2. mysql 表关系传递,mysql数据表之间数据相互传递的问题
  3. 龙族幻想最新东京机器人位置_龙族幻想:最强“人形兵器”格斗家降临卡塞尔学院...
  4. pb dw graph增加series_如何快速增加tiktok视频的播放量
  5. java共同方法_java-现有公共方法的NoSuchMethodError
  6. markdown 本地链接_Markdown从入门到入坑
  7. SpringBoot、mybatis、Druid结合使用存储emoji图标
  8. vim编辑器操作汇总
  9. 字符串以及文件的hashlib的md5和sha1等的运用
  10. 启动和停止数据库——停止例程