linux中怎么创建管道文件,Linux 管道文件
管道是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 管道文件相关推荐
- linux中mkfs创建文件系统,linux mkfs命令创建Linux文件系统
功能描述 使用mkfs命令可以在分区上创建各种文件系统.mkfs命令本身并不执行建立文件系统的工作,而是去调用相关的程序来执行.这里的文件系统是要指定的,如ext4.ext3.vfat或msdos等. ...
- linux系统创建操作系统用户,linux系统中用户组创建管理linux操作系统 -电脑资料...
用户组管理包括对用户组创建,删除,修改及查看组操作命令,下面我们一起来看看希望本文章对各位同学会有所帮助哦, 1,创建组 groupadd test 增加一个test组 2,修改组 groupmod ...
- linux中original_如何在 Linux 中整理磁盘碎片
如何在 Linux 中整理磁盘碎片 转载自: 如何在 Linux 中整理磁盘碎片linux.cn 有一个神话是 linux 的磁盘从来不需要整理碎片.在大多数情况下这是真的,大多数因为是使用的是优秀 ...
- 在linux中的sort命令,linux中sort命令
功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. 参 数: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字母.数 ...
- linux中用户组和用户,linux中用户和用户组
一.用户和组原理 一个用户可以属于多个组,一个组有多个用户 在Linux中操作系统必须依赖组和用户进行管理 二.与用户和组相关的配置文件 1.组相关配置文件 1)/etc/group :管理用户组信息 ...
- linux中文件链接,关于Linux中文件,链接的一些思考
在Unix系统中,操作系统为磁盘上的文本与图像,鼠标键盘操作,网络交互等IO操作设计了一组通用API. 使他们被处理的时候可统一用字节流的方式.所以说,除了进程之外,其他的一切均可看做文件. Linu ...
- 网页修改linux命令行,linux中文本修改操作命令linux网页制作 -电脑资料
在命令模式下可以使用 vi 提供的各种有关命令对文本进行修改,包括对文本内容的删除.复制.取代和替换等, 1. 文本删除/移动 在编辑文本时 ,经常需要删除一些不需要的文本,我们可以用键将输错或不需要 ...
- linux中make命令大全,Linux中的命令 make -f 是什么意思
二.Makefile的文件名 默认的情况下,make命令会在当前目录下按顺序找寻文件名为"GNUmakefile"."makef ile"."Make ...
- python递归创建目录_Python学习第172课——Linux中一次性创建多层目录以及递归列出所有子目录...
我们现在是学习Linux,Linux是服务器.云计算方面的东西,我要把这些东西都掌握,我们现在要开始去学,那我们现在在桌面专门建一个文件夹,名字叫做Linux,这个文件夹用来保存我们专门去学习的东西. ...
最新文章
- 第十六届智能车竞赛视觉AI组相关议题讨论
- iOS UIScrollView的简单使用
- 彻底理解Spring IOC和DI
- 【工作感悟】mysql授权root远程访问
- JSDOM模型的样例
- OpenStack的部署T版(八)——Dashboard
- 交换机多少钱一个?影响工业交换机价格的因素?
- XPath与lxml类库
- json解析对应的value为null_解决golang json解析出现值为空的问题
- java 一一对应的替换_java 如何实现按表替换
- linux rz sz putty,PuTTY xshell rz sz命令实现上传下载到windows的方法
- 不一样的AI:“上天入地”的IBM人工智能
- 金田变频器说明书_金田BH386系列变频器使用手册.pdf
- 图灵机器人源码php,使用图灵机器人api搭建微信聊天机器人php实现-后台/架构/数据库-敏捷大拇指-一个敢保留真话的IT精英社区...
- HANA中临时表查询DUMMY
- Prettier formatter for vscode 配置单引号问题
- 电脑管家卸载后留下的一个叫 电脑管家-安全注册 的进程,无法关闭。展开的服务是 qmbsrv
- 百度推广——搜索营销新视角(百度官方出品,俞敏洪、吴晓波、徐雷力荐!)
- 飞车竞速-姜雪伟-专题视频课程
- 文章汇总【就R不E让I找D到系列part1】