linux中管道的概念,浅谈Linux管道

管道(pipe)是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念。管道是UNIX环境中历史最悠久的进程间通信方式,从本质上说,管道也是一种文件,也是遵循UNIX的“一切皆文件”的原则设计的。虽然实现形态上是文件,但是管道本身并不占用磁盘或者其他外部存储的空间。在Linux的实现上,它占用的是内存空间。所以,Linux管道实际上就是一个操作方式为文件的内存缓冲区。

一、Linux管道分两种类型:匿名管道和命名管道也叫做有名或无名管道

匿名管道最常见的形态就是我们在shell操作中最常用的”|”。它的特点是只能在父子进程中使用,父进程在产生子进程前必须打开一个管道文件,然后fork产生子进程,这样子进程通过拷贝父进程的进程地址空间获得同一个管道文件的描述符,以达到使用同一个管道通信的目的。此时除了父子进程外,没人知道这个管道文件的描述符,所以通过这个管道中的信息无法传递给其他进程。这保证了传输数据的安全性,当然也降低了管道了通用性,于是系统还提供了命名管道。

二、Linux管道的实现机制

在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题:

1.限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。

2.读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。

三、linux管道的结构

在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。

四、linux管道的代码示例

管道由pipe函数创建:

#include

int pipe(int filedes[2]);

调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端。向这个文件读写数据其实是在读写内核缓冲区。pipe函数调用成功返回0,调用失败返回-1。

子进程通过管道向父进程发送数据。限制在父子进程间通信。

#include

#include

#include

#include

#include

#include

int main () {

char* msg;

char buf[20];

int pipe_filed[2];

pipe(pipe_filed);

pid_t pid = fork();

if(pid < 0) {

perror("fork errir.");

exit(1);

} else if (0 == pid) {

msg = "child";

write(pipe_filed[1], msg, sizeof(msg));

printf("child process send: %s\n", msg);

} else {

read(pipe_filed[0], buf, sizeof(buf));

printf("parent process recv: %s\n", buf);

int status;

wait(&status);

if (WIFEXITED(status))

printf("Child exited with code %d\n", WEXITSTATUS(status));

else if (WIFSIGNALED(status))

printf("Child terminated abnormally, signal %d\n", WTERMSIG(status));

}

return 0;

}

两个进程通过一个管道只能实现单向通信,比如上面的例子,子进程写父进程读,如果有时候也需要父进程写子进程读,就必须另开一个管道。

管道其实是一个在内核内存中维护的缓冲器,这个缓冲器的存储能力是有限的。管道被填满之后,后续向管道写入操作都会被堵塞直到有读取进程读取管道中的数据。至于如何从Linux管道中读取数据,可以在本站的Linux教程中找到详细的解答。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ttl接地是高电平还是低电平_说明图3.12中各门电路的输出是高电平还是低电平。已知它们都是74HC系列的CMOS电路 简单的逻辑门电路 判断各门电路...

1、高电平&#xff0c;有关。2、低电平。3、输入端接电源&#xff0c;悬空或高阻(10k以上)相当于接高电平&#xff0c;接地为低电平&#xff0c;通过低阻接入电平信号则认为输入信号与接入电平相同。则为OC门。图中的第一个输入为高电平&#xff0c;电路为与非门&#xff0c;则…

linux redis安装报错,Linux安装Redis实现过程及报错解决方案

今天安装redis出现些之前安装不曾出现错误&#xff0c;一并在此做个记录一、安装redis及出现错误首先下载redis&#xff0c;官方下载地址页面&#xff1a;https://redis.io/download我们这里选择稳定版6.0.1版本正常安装步骤如下&#xff1a;[rootlocalhost ~]# yum install gc…

python 工资管理软件_4_python之路之模拟工资管理系统

#!/usr/bin/env python#_*_ coding: utf-8 _*_#author&#xff1a;chenjianwen#email&#xff1a;1071179133qq.com importsys,os##定义操作列表 ops [查询员工工资,修改员工工资,增加新员工记录,退出] info{}defget_info():##读取文件得到员工信息 globalinfo with open(info…

dateformat 返回类型_SpringBoot返回date日期格式化

SpringBoot返回date日期格式化&#xff0c;解决返回为TIMESTAMP时间戳格式或8小时时间差问题描述在Spring Boot项目中&#xff0c;使用RestController注解&#xff0c;返回的java对象中若含有date类型的属性&#xff0c;则默认输出为TIMESTAMP时间戳格式(数据库datetime类型查询…

linux gcc中sin30度,学习gcc.pdf

学习gcc如何在 Ubuntu 下安装和使用 gccGCC 是在Linux 系统中用的比较多的编译器&#xff0c;一般做Linux 开发的朋友都会用 GCC 编译器&#xff0c;但今天在 Ubuntu 上安装 GCC 时出现了问题&#xff0c;于是上网查询如何在Ubuntu 上安装 GCC&#xff0c;答案如下&#xff1a;…

python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法

本文实例为大家分享了python实现单链表中删除倒数第K个节点的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 题目&#xff1a; 给定一个链表&#xff0c;删除其中倒数第k个节点。 代码&#xff1a; class LinkedListAlgorithms(object): def __init__(self): pass d…

工业机器人工具中心点标定的意义_一种利用平面标定板的机器人工具中心点标定方法_2015108676182_说明书_专利查询_专利网_钻瓜专利网...

技术领域本发明涉及机器人工具中心点(Toolcenterpoint,TCP)标定方法&#xff0c;尤其涉及一种利用平面标定板的机器人工具中心点标定方法。背景技术机器人工具中心点(Toolcenterpoint,TCP)是与机器人工具固连的工具坐标系的原点&#xff0c;工具实际工作点在工具坐标系中的坐标…

自动感光调节LED灯亮度C语言程序,单片机PWM调节LED灯亮度

刚搞完飞思卡尔智能车&#xff0c;昨天我一起做车的搭档跑来跟我说魏老师(我们系的前主任&#xff0c;不知道他们怎么认识的....)叫他帮忙做个可通过无线遥控调节LED灯亮度的设计方案&#xff0c;问我有没有兴趣做做&#xff0c;主要是魏老师也是受他以前的老同学(合工大的....…

python找到字符中空格所在的位置_Python 查找字符在字符串中的位置示例效果

Python 查找字符在字符串中的位置实例 下面为大家分享一篇Python 查找字符在字符串中的位置实例&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起过来看看吧 str_1wo shi yi zhi da da niu char_1i nPosstr_1.index(char_1) print(nPos) 运行结果&#xf…

ztree 自定义参数_Ztree节点前加上两个自定义按钮

前言&#xff1a;在我的权限管理模块遇到了给某些角色加权限的问题&#xff0c;这时就需要实现将每个模块做成树&#xff0c;在每个节点前加上预览和编辑的按钮&#xff0c;这样可以根据数据库的某个字段给每个角色赋权限。必须必须吐槽的是&#xff0c;这部分的功能在网上没找…

xilinx c语言编程,使用Xilinx SDSoc在Xilinx zcu102开发板上编程HelloWorld

关于Xilinx SDSoc的介绍我就不再复述了&#xff0c;我理解的也不一定准确&#xff0c;可以阅读官方文档了解SDSoc&#xff0c;你可以把它理解为一个集成开发环境 (IDE)&#xff0c;通过SDSoc我们能够简单快速的对Xilinx的开发板进行编程&#xff0c;不用像传统的嵌入式编程那样…

python画图小猪佩奇_吊炸天!Python 20秒画出小猪佩奇

原标题&#xff1a;吊炸天&#xff01;Python 20秒画出小猪佩奇 今年社交平台上的带货女王是谁?范冰冰?杨幂?Angelababy?不&#xff0c;是猪猪女孩小猪佩奇。 小猪佩奇在构图基本是各种曲线&#xff0c;类抛物线、类圆、类椭圆、类二次贝塞尔曲线。因为画图画曲线不是Pytho…

win10c语言错误,win10打开程序提示错误状态0xc0000020的原因和解决方法

win10系统打开程序弹出“c:\xx\xxx.dll没有被指定在windows上运行&#xff0c;或者它包含错误。请尝试使用原始安装介质重新安装程序&#xff0c;或联系你的系统管理员或软件供应商以获取支持。错误状态0xc0000020 ”的提示&#xff0c;这到底是什么情况&#xff1f;这 一般是由…

poll和死锁_计算机基础知识

转自&#xff1a;http://blog.csdn.net/qq_15437629/article/details/52388685在这里只做备份计算机网络TCP/IP模型TCP/IP协议集的分层实施:为什么要给网络划分层次&#xff1f;(1)各层之间相对独立&#xff0c;每层都可以用最合适的技术实现&#xff1b;(2)各层只需知道通过层…

matlab 向量_Matlab基础入门

感谢大家观看你所做的事情,也行暂时看不到成功,但不要灰心,你并不是没有成长,而是在扎根.前情提要本篇文章将会分多次发放(原因内容太长,导致写的是否微信卡崩了&#x1f643;), 目的在于从基础的Matlab的教程开始慢慢的深入. 如果大家看到该文章有些格式上的错误或内容上的错误…

2017蓝桥c语言真题,[蓝桥杯][2017年第八届真题]发现环 (C语言代码)------------C语言——菜鸟级...

解题思路:并查集 找环 未成环之前 看作一个树用并查集找到环 两点 找的同时 建立一个 并查集树(自己瞎起的)找到两点后从两个点分别回到并查集的根节点经过的点标记上 这两个点单独经过的点(交点处除外)都是环上点原文 欢迎访问 我的博客注意事项:参考代码:#include#include#d…

python34.dll_python34.dll下载

缺少python34.dll&#xff1f;python34.dll文件是存放在电脑系统中很重要的一个文件&#xff0c;是电脑程序正常运行的重要支持&#xff0c;大家要是发现这个文件缺少了就要立马重新下载一个&#xff0c;欢迎有需要的朋友来当易网下载。dll文件特点推广模块式体系结构DLL 有助于…

python全文检索引擎_Python中使用haystack实现django全文检索搜索引擎功能

{% if query %}搜索结果如下&#xff1a; {% for result in page.object_list %} {{ result.object.gName }} {% empty %}啥也没找到 {% endfor %} {% if page.has_previous or page.has_next %}{% if page.has_previous %}{% endif %} 上一页{% if page.has_previous %}{% end…

c语言音像图书管理系统设计,c语言--图书管理系统

(1)创建音像图书库。此图书库中有图书&#xff0c;VCD&#xff0c;录像带3类&#xff0c;而每个音像图书的信息均包括编号(用B**,V**,R**分别表示图书&#xff0c;VCD和录像带的编号)&#xff0c;名称&#xff0c;原价&#xff0c;原数量及剩余数量。(2)租借音像图书。在文件&q…

python环境配置opencv_【Python】python2.7 安装配置OpenCV2

原博文 2017-05-23 22:28 − 环境&#xff1a;Ubuntu16.04 anaconda Python2.7 opencv2.4.13 安装opencv后 import cv2 遇到错误信息&#xff1a; No module named cv2 安装opencv时make的过程中会出现文件“cv2.so”&#xff0c;它是连接OpenCV和... 相关推荐 2019-12-04 13:5…