inux

管道管道是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用pipe创建的文件类型,linux文件类型之 管道相关推荐

  1. linux系统下创建symlink(@)即文件软链接(快捷方式)的命令

    问题起源: 在一个项目中看到有bert@文件名及大量的bert.20200501,bert.20200601等文件夹? 第一个问题文件名带@符号代表什么 第二个问题这样的做意义是什么 解答: 第一个问 ...

  2. linux自动生成证书,linux shell自动创建ca证书脚本linux操作系统 -电脑资料

    在linux下创建证书大概是大多数人很头疼的事情,今天我在网上搜到个不错的shell自动创建ca证书的脚本,来分享给大家. 脚本内容:代码如下复制代码 #!/bin/bash # Author: MO ...

  3. linux查看允许创建多少个进程,Linux下查看某个进程创建了多少线程

    方法一: 1. 找出进程号: cba001:/proc/21723 # ps -ef|grep named root     30659     1  0 16:45 ?        00:00:0 ...

  4. linux在tty3创建用户,我对linux理解之tty三

    ------------------------------------------ 本文系本站原创,欢迎转载!------------------------------------------我们 ...

  5. Linux下SVN创建新的项目

    Linux下SVN创建新的项目 Linux环境下的SVN创建新的项目 一.前置条件: 1)有安装了linux系统的服务器,123.*.*.29 2)服务器上安装了svn,本人服务器的svn的数据安装的 ...

  6. Linux操作系统——批量创建用户

    Linux操作系统--批量创建用户 文章目录 Linux操作系统--批量创建用户 第一步:创建组群GID为650的是student的组群 第二步:创建用户信息文件students.txt,并用vim编 ...

  7. linux线程的创建与删除

    linux线程的创建与删除 使用linux线程时,编译时需要包含-pthread选项. Linux通用API返回0表示成功,返回-1表示失败,并设置errno以标识错误原因.但Pthreads相关的A ...

  8. 创建linux目录,Linux目录的创建方法

    创建一个井然有序的目录,可以提高工作效率.现在我们要学习Linux目录的创建方法.那么Linux目录的创建方法是什么呢?今天学习啦小编与大家分享下Linux创建目录的具体操作步骤,有需要的朋友不妨了解 ...

  9. linux非守护线程一直不释放,Linux pthread 和 java thread 的是 / 非守护线程的行为

    Linux pthread 和 java thread 的是 / 非守护线程的行为 pthread_xxx 的函数并没有直接提供设置一个 pthread 为守护线程的 API 而 pthread_at ...

最新文章

  1. Placement new的用法及用途
  2. java类定义的顺序_Java类及对象的初始化顺序
  3. spring websocket Converters must not be empty
  4. 微软公司部署小型数据中心网络连接产品
  5. Ubicomp2018年论文列表
  6. OpenInfra 基金会积极推动开源项目在中国市场的发展与应用
  7. android将拍摄的图片存入sd卡中,Android将图片保存至SD卡上
  8. linux改变文件所属用户和组
  9. 递推+高精度——蜜蜂路线(洛谷 P2437)
  10. 罗永浩出任“鲨纹科技”首席忽悠官;华为生产不含美国芯片的手机;PyCharm 2019.3 发布 | 极客头条...
  11. 使用面向 iOS 的本机插件扩展
  12. nginx基于域名的虚拟主机配置实战
  13. matlab2015使用dsolve错误,matlab - 当变量乘以常数时,dsolve中的错误(R2011a) - 堆栈内存溢出...
  14. 程序员新电脑常用软件安装
  15. OpenWrt 内的阿里云盘 WebDAV 做磁盘使用
  16. 华为公司“奇葩”面试题流出:高薪背后的3个认知层次,你在哪一层?
  17. java调起本地摄像头,利用openCV进行人脸识别(一)
  18. 教您正确选择一款合适您的家用路由器
  19. 【渝粤教育】广东开放大学 广东开放大学学习指引 形成性考核 (28)
  20. 游戏开发商如何租用合适稳定的游戏服务器?

热门文章

  1. 量子计算机是否存在相对论,潘建伟团队再登Science:寻找广义相对论与量子力学的桥梁...
  2. python绘制动画示例_Python使用matplotlib绘制动画的方法
  3. qfile 创建文件_Qt之二进制文件读写
  4. python与sqlite3_sqlite3与python2.5,pysqlite和apsw有什么区别
  5. canva画图 图片居中裁剪_css实现不定宽高的图片img居中裁剪_类似微信朋友圈图片效果...
  6. C语言没有引用,只有指针
  7. Python3 三步爬楼梯问题
  8. 艾默生变频器报警PHP,艾默生ct变频器报警ou 这个CT的变频器报警UU怎么解决?
  9. 客制化键盘键位修改_可以用很漂亮形容的一把键盘,差一步就完美
  10. 笔记本电脑电源已接通未充电_dell xps15 电源已接通 未充电 维修方法