管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建。Linux管道的实现机制从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:· 限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。· 读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。1. 管道的结构

在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。2.管道的读写 管道实现的源代码在fs/pipe.c中,在pipe.c中有很多函数,其中有两个函数比较重要,即管道读函数

pipe_read()和管道写函数pipe_wrtie()。管道写函数通过将字节复制到 VFS 索引节点指向的物理内存而写入数据,而管道读函数则通过复制物理内存中的字节而读出数据。当然,内核必须利用一定的机制同步对管道的访问,为此,内核使用了锁、等待队列和信号。

当写进程向管道中写入时,它利用标准的库函数write(),系统根据库函数传递的文件描述符,可找到该文件的

file 结构。file 结构中指定了用来进行写操作的函数(即写入函数)地址,于是,内核调用该函数完成写操作。写入函数在向内存中写入数据之前,必须首先检查

VFS 索引节点中的信息,同时满足如下条件时,才能进行实际的内存复制工作:·内存中有足够的空间可容纳所有要写入的数据;·内存没有被读程序锁定。如果同时满足上述条件,写入函数首先锁定内存,然后从写进程的地址空间中复制数据到内存。否则,写入进程就休眠在

VFS 索引节点的等待队列中,接下来,内核将调用调度程序,而调度程序会选择其他进程运行。写入进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接收到信号。当数据写入内存之后,内存被解锁,而所有休眠在索引节点的读取进程会被唤醒。

管道的读取过程和写入过程类似。但是,进程可以在没有数据或内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件或管道的打开模式。反之,进程可以休眠在索引节点的等待队列中等待写入进程写入数据。当所有的进程完成了管道操作之后,管道的索引节点被丢弃,而共享数据页也被释放。

因为管道的实现涉及很多文件的操作,因此,当读者学完有关文件系统的内容后来读pipe.c中的代码,你会觉得并不难理解。Linux 管道的创建和使用都要简单一些,唯一的原因是它需要更少的参数。实现与

Windows 相同的管道创建目标,Linux 和 UNIX 使用下面的代码片段:pipe函数来创建 Linux 命名管道int fd1[2];if(pipe(fd1)){ printf("pipe()

FAILED: errno=%d",errno);return

1;}Linux 管道对阻塞之前一次写操作的大小有限制。专门为每个管道所使用的内核级缓冲区确切为 4096 字节。 除非阅读器清空管道,否则一次超过 4K 的写操作将被阻塞。实际上这算不上什么限制,因为读和写操作是在不同的线程中实现的。Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较

Linux 的命名管道和 Windows 的命名管道。我写了另一个在 Linux 上使用命名管道的程序。我发现对于 Linux 上命名的和未命名的管道,结果是没有区别。Linux 管道比 Windows 2000 命名管道快很多,而 Windows 2000 命名管道比 Windows XP 命名管道快得多。例子:#include#includeint 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);}

linux中怎么创建管道文件,Linux  管道文件相关推荐

  1. linux中mkfs创建文件系统,linux mkfs命令创建Linux文件系统

    功能描述 使用mkfs命令可以在分区上创建各种文件系统.mkfs命令本身并不执行建立文件系统的工作,而是去调用相关的程序来执行.这里的文件系统是要指定的,如ext4.ext3.vfat或msdos等. ...

  2. linux系统创建操作系统用户,linux系统中用户组创建管理linux操作系统 -电脑资料...

    用户组管理包括对用户组创建,删除,修改及查看组操作命令,下面我们一起来看看希望本文章对各位同学会有所帮助哦, 1,创建组 groupadd test 增加一个test组 2,修改组 groupmod ...

  3. linux中original_如何在 Linux 中整理磁盘碎片

    如何在 Linux 中整理磁盘碎片 转载自: 如何在 Linux 中整理磁盘碎片​linux.cn 有一个神话是 linux 的磁盘从来不需要整理碎片.在大多数情况下这是真的,大多数因为是使用的是优秀 ...

  4. 在linux中的sort命令,linux中sort命令

    功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. 参 数: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字母.数 ...

  5. linux中用户组和用户,linux中用户和用户组

    一.用户和组原理 一个用户可以属于多个组,一个组有多个用户 在Linux中操作系统必须依赖组和用户进行管理 二.与用户和组相关的配置文件 1.组相关配置文件 1)/etc/group :管理用户组信息 ...

  6. linux中文件链接,关于Linux中文件,链接的一些思考

    在Unix系统中,操作系统为磁盘上的文本与图像,鼠标键盘操作,网络交互等IO操作设计了一组通用API. 使他们被处理的时候可统一用字节流的方式.所以说,除了进程之外,其他的一切均可看做文件. Linu ...

  7. 网页修改linux命令行,linux中文本修改操作命令linux网页制作 -电脑资料

    在命令模式下可以使用 vi 提供的各种有关命令对文本进行修改,包括对文本内容的删除.复制.取代和替换等, 1. 文本删除/移动 在编辑文本时 ,经常需要删除一些不需要的文本,我们可以用键将输错或不需要 ...

  8. linux中make命令大全,Linux中的命令 make -f 是什么意思

    二.Makefile的文件名 默认的情况下,make命令会在当前目录下按顺序找寻文件名为"GNUmakefile"."makef ile"."Make ...

  9. python递归创建目录_Python学习第172课——Linux中一次性创建多层目录以及递归列出所有子目录...

    我们现在是学习Linux,Linux是服务器.云计算方面的东西,我要把这些东西都掌握,我们现在要开始去学,那我们现在在桌面专门建一个文件夹,名字叫做Linux,这个文件夹用来保存我们专门去学习的东西. ...

最新文章

  1. 第十六届智能车竞赛视觉AI组相关议题讨论
  2. iOS UIScrollView的简单使用
  3. 彻底理解Spring IOC和DI
  4. 【工作感悟】mysql授权root远程访问
  5. JSDOM模型的样例
  6. OpenStack的部署T版(八)——Dashboard
  7. 交换机多少钱一个?影响工业交换机价格的因素?
  8. XPath与lxml类库
  9. json解析对应的value为null_解决golang json解析出现值为空的问题
  10. java 一一对应的替换_java 如何实现按表替换
  11. linux rz sz putty,PuTTY xshell rz sz命令实现上传下载到windows的方法
  12. 不一样的AI:“上天入地”的IBM人工智能
  13. 金田变频器说明书_金田BH386系列变频器使用手册.pdf
  14. 图灵机器人源码php,使用图灵机器人api搭建微信聊天机器人php实现-后台/架构/数据库-敏捷大拇指-一个敢保留真话的IT精英社区...
  15. HANA中临时表查询DUMMY
  16. Prettier formatter for vscode 配置单引号问题
  17. 电脑管家卸载后留下的一个叫 电脑管家-安全注册 的进程,无法关闭。展开的服务是 qmbsrv
  18. 百度推广——搜索营销新视角(百度官方出品,俞敏洪、吴晓波、徐雷力荐!)
  19. 飞车竞速-姜雪伟-专题视频课程
  20. 文章汇总【就R不E让I找D到系列part1】

热门文章

  1. HDOJ 2072 单词数
  2. SQL CASE 的用法
  3. 常见错误Delegate already added to touch dispatcher.的解决方案
  4. hdu 4288 Coder (成都赛区 线段树)
  5. cms 移动根节点到根节点中的子节点,根节点消失解决办法
  6. VS2015解决非Unicode编码包含中文字段无法编译的问题
  7. VS2013模块对于SAFESEH映像是不安全的解决方法
  8. vue中解决three.js出现内存泄漏丢失上下文问题
  9. coursera 视频总是缓冲或者无法观看,有什么方法解决?
  10. Redis的中并发问题的解决方案小结