linux无名管道

Linux &有名管道和无名管道的区别与实现 1.进程间的通信方式有五种,分别为:管道,信号量,共享内存,消息队列和套接字.本次主要介绍管道. 2.管道分为有名管道和无名管道两种,它们的区别是: 有名管道又称为命名管道,可以在任意两个进程之间进行通信;而无名管道只能在父子进程之间进行通信. 3.写入管道的数据是存储在内存上的. 4.管道的通信方式为半双工通信,即只能以只读或者只写的方式打开,不能同时进行读写操作. 5.对管道进行操作时要同时打开两个进程,一个读,一个写. 6.mkfifo fifo:创建有名管道文件fifo; pipe():创建无名管道 阅读详情

管道(无名管道):

管道和套接字一样不是属于进程的资源,而是属于操作系统的,因此也就不是fork的对象,fork只是复制了文件描述符。

 

管道的创建:

int pipe(int fd[2]);          //成功返回0,失败返回-1;

参数:指向意图存放文件描述符的int变量的指针(作参数时退化为指针,无法传递大小)

传参时,只需要传递一个元素类型为int大小为2的数组名即可,函数调用成功后数组中将存有两个文件描述符

pipefd[0]元素的描述符为管道读端, 只能用来读;pipe[1]元素的描述符为管道写端,只能用来写。


在使用管道时,应该将对自己来说没有的一端关闭close(),然后再使用自己需要的一端read()或write()

 

管道的特点:

1、管道通信是单向的,为半双工通信,因此数据只能由一个进程流向另一个进程,如果想要全双工通信,需要建立两个管道

2、写入的数据每次都添加到管道缓冲区的末尾,读数据的时候都是从缓冲区的头部读出数据。因此遵守先入先出的原则,即先写入的数据先读出。

3、管道的缓冲区大小是受限制的,且数据以无格式字节流的方式传输,需要输入方与输出方约定好数据格式

4、管道中的数据一旦被读取,将会从管道中消失。

5、管道只能用于父子进程或者兄弟进程间通信,即只能用于有亲缘关系的进程间通信

 

管道读写规则

当没有数据可读时

  • O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。
  • O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。

当管道满的时候

  • O_NONBLOCK disable: write调用阻塞,直到有进程读走数据
  • O_NONBLOCK enable:调用返回-1,errno值为EAGAIN

如果所有管道写端对应的文件描述符被关闭,则read返回0

如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE

当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性。

当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

Detail 参见:

http://man7.org/linux/man-pages/man7/pipe.7.html

http://blog.youkuaiyun.com/nodeathphoenix/article/details/23284157

 

 

 

 

实现机制:

管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。


从原理上,管道利用fork机制建立,从而让两个进程可以连接到同一个PIPE上。最开始的时候,上面的两个箭头都连接在同一个进程Process1上(连接在Process 1上的两个箭头)。当fork复制进程的时候,会将这两个连接也复制到新的进程(Process2)。随后,每个进程关闭自己不需要的一个连接 (两个黑色的箭头被关闭;Process 1关闭从PIPE来的输入连接,Process 2关闭输出到PIPE的连接),这样,剩下的红色连接就构成了如上图的PIPE。


http://www.cnblogs.com/biyeymyhjob/archive/2012/11/03/2751593.html

 

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

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

·      读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。

注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。

http://www.cnblogs.com/davidwang456/p/3839874.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Linux 高级编程 - 无名管道 Pipe 阅读详情

相关推荐

vscode使用continue插件连接LM studio的模型

本文详细介绍了如何使用VSCode的Continue插件连接LM Studio模型。主要步骤包括:在LM Studio中加载模型并设置相关参数,启动API服务,修改Continue配置文件以集成LM Studio模型,并进行测试以验证连接是否成功。通过这些步骤,用户可以将LM Studio中的预训练模型与VSCode的Continue插件无缝对接,实现高效的自然语言处理和编程辅助功能。

weixin_43590837的博客 8629

08LinuxC进程间通信之无名管道pipe的管道缓冲区大小查看(ulimit –a,fpathconf函数)和管道的优劣

1 管道缓冲区大小 可以看到下面的结果。分析比较常用的选项。 1)core file size:该大小会影响呢gdb调试时,是否生成core调试文件。可以自己设置,ulimit -c size。 2)open files:最大打开文件描述符的大小。 3)pipe size:也就是我们 这节的管道缓冲区的大小,4096k。 4)stack size:栈大小。 2 fpathconf函数 也可以使用fpathconf函数,借助参数选项来查看。使用该宏应引入头文件<unistd.h>。但是用的比

weixin_44517656的博客 1309

VMware Workstation Pro 17 最新破解版安装教程(附永久激活密钥)

本文详细介绍了VMware Workstation Pro 17专业版的安装与配置指南,包括系统要求检查、官方版本安装流程、高级配置优化及常见问题排查。通过合规使用官方版本,开发者可以充分利用其强大的虚拟化能力,提升多平台开发与测试效率。

weixin_29327977的博客 3555

【Linux系统编程(六)】无名管道

管道(pipe)又称无名管道。无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符。

K3169的博客 2062

SpyGlass CDC实战:如何用sgdc约束文件解决跨时钟域报错(附常见错误排查)

本文详细介绍了如何使用SpyGlass CDC工具编写sgdc约束文件解决跨时钟域(CDC)报错问题。从基础语法到实战案例,涵盖时钟声明、复位约束、路径豁免等关键技巧,特别针对SPI断续时钟等特殊场景提供解决方案,并附常见错误排查指南,帮助工程师高效完成CDC验证。

weixin_28744423的博客 626

openai联合创始人用1000行纯C语言手搓的GPT-2训练代码

不久之前,特斯拉前 AI 总监、OpenAI 联合创始人 Andrej Karpathy 在社交媒体平台 X 上高调宣布,他友好地从 OpenAI 离职,未来将专注于“个人项目”,而后又口口声声说要尝试性地戒掉上网两周,去了 Bhutan(不丹王国)休假。然后就手搓如下代码,我们一起来欣赏.这段代码是一个GPT-2模型的训练实现,包括前向传播、后向传播、参数更新等过程。代码中包含了注释,解释了每个函数和代码块的作用。此外,还有一些辅助函数和结构体,用于数据加载、随机数生成和模型的初始化与释放。这个训练循环还

zhangzhechun的专栏 1212

进程间通信->管道

进程间通信:管道,信号量,共享内存,消息队列,套接字 管道文件:使用它需要同时有一个进程以写的方式打开,一个进程以读的进程打开 有名管道:mikfifo(命令,库函数)创建管道->1命令创建2代码创建 管道为空,读,阻塞 管道写端关闭,读,read返回值为0 管道读端关闭,写,异常->SIGPIPE 无名管道:主要用于父子进程之间,pipe创建无名管道,半双工通信 fd[0]读数据,f...

weixin_44736644的博客 351

无源定位之时差估计的精确时差估计算法(ETDE)及MATLAB实现程序

时差估计算法之精确时差估计(ETDE)欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想

伊谢尔伦的林中小路 4255

Linux管道学习(无名管道)

调用失败返回-1,成功返回0;调用成功时该函数会创建一个单向的管道用于进程之间的通讯,返回的管道包含读端和写端,其中fd[0]用于读,fd[1]用于写,写到fd[1]的数据会被内核保存到缓冲区,直到fd[0]读走数据。

1700

OpenClaw 最强技能 self-improving-agent 详解:让 AI 从错误中自主学习

self-improving-agent 是 OpenClaw 生态中最受欢迎的技能插件,下载量突破 268k。它能让 AI 记住犯过的错误和解决方案,实现持续自我改进。本文深入讲解其工作原理、安装配置和实战案例。测试数据显示:部署流程时间从 15 分钟降到 2 分钟(87%↓),API 调试时间从 2 小时降到 20 分钟,数据库查询编写时间减少 90%。文章包含完整架构图、配置文件示例、3 个详细实战案例和性能测试数据,适合开发者、运维和数据分析师使用。

qq_38610923的博客 3635

【STM32】STM32 CANFD外设的几种消息接收过滤模式

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

林愿留的博客 6226

Linux进程通信:无名管道

Linux进程通信:无名管道

坚持学习 1286

Creo模型装配总结

creo7.0的零件装配操作方法,建立基准面、新建约束、约束顺序

heda3的博客 1万+

linux进程中的有名管道和无名管道

有名管道和无名管道

sir2022的博客 1389

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux系统编程之无名管道

在Linux系统中,无名管道是一种简单的进程间通信机制。它允许一个进程创建一对文件描述符,其中一个用于读取,另一个用于写入。当一个进程通过系统调用创建了一个无名管道后,便可以将这两个文件描述符传递给它的子进程,使得父子进程之间可以进行单向的数据交换。

hope_wisdom的技术博客 1207

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Linux管道通信实战:无名管道和有名管道通信完整示例

本文介绍了无名管道和有名管道在进程间通信(IPC)中的应用,展示了如何通过管道实现父子进程、兄弟进程甚至不同进程间的单向与双向通信。

weixin_56167571的博客 1535

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Linux】管道文件(有名管道、无名管道)

【Linux】管道文件(有名管道、无名管道) 多进程编程的目的就是为了同时完成多个任务。 例如:一个产品,一个软件,需要n个进程同时执行才能完成,而这些进程之间一定是有所联系的。 因此:多进程工作时,进程间需要通讯(传递数据)。 fork()创建的子进程,与父进程之间唯一共享的是文件描述符。   进程之间的通讯方式有: 管道 信号量 消息队列 共享内存 Socket (用于网...

VVVv_0427的博客 4545

无名管道双向通讯linux

无名管道双向通讯linux 基础知识 1.Linux中一种简单且使用频繁的进程间通信方式 2.一种特殊的管道文件,只存在于内存中,不使用外存 3.管道是单向的、先进先出的、无结构的、固定大小的字节流 4.写进程在管道的尾端写入数据,读进程在管道的首端读出数据 数据读出后将从管道中移走 5.管道的流控制机制: 进程试图读空管道时,在有数据写入管道前,进程将一直阻塞 管道已经满时,进程再试图写管道,在...

ice_night的博客 616

一文吃透Linux无名管道,看完秒懂

通过对 Linux 无名管道的深入探索,我们了解到它作为一种古老而强大的进程间通信方式,在 Linux 系统中扮演着不可或缺的角色。从简单的日常命令使用,到复杂的系统任务处理,无名管道都展现出了其高效、灵活的特性。它独特的单向字节流、文件特质以及对有亲缘关系进程通信的支持,使其在许多场景中都能发挥重要作用。无论是在日志处理、数据处理还是进程控制与协作等应用场景中,无名管道都像是一座无形的桥梁,连接着不同的进程,让它们能够协同工作,完成各种复杂的任务。

大雨淅淅的博客 1378

linux无名管道实验代码,Linux 进程间通讯之创建无名管道和读写无名管道

Linux进程间通讯的方式:1. 管道(pipe)和有名管道(FIFO).2. 信号(signal)3. 消息队列4. 共享内存5. 信号量6. 套接字(socket)管道通讯:无名管道:由pipe()函数创建,int pipe(int filedis[2]), 当管道建立时有两个文件描述符,filedis[0]用于读管道,filedis[1]用于写管道。关闭管道,仅需将两个文件描述符关闭即可。...

weixin_31856057的博客 612

linux系统编程---无名管道和有名管道

一、基本概念 无名管道:无名管道是linux系统内核的特殊文件,用于进程之间的通信,无名管道相当于一个队列结构,fd[1]为写入端(入队),fd[0]为读出端(出队)。其中信息读出后即删除,再次读取时即为下一个信息。 有名管道: 二、无名管道 管道是创建在内存中的,进程结束空间释放,管道不复存在; 无名管道和有名管道都是半双工通信,实现双向通信需要建立两个管道; 无名管道是linux特殊文件; 无名管道只用于父子进程之间,有名管道可用于无亲缘关系的进程之间。 (1)接口说明 ..

智小星的博客 2006

Linux无名管道

// 无名管道 #include<unistd.h> #include<fcntl.h> #include<stdio.h> #include<stdlib.h> #include<sys/types.h> void main(){ int pid,mypipe[2]; pipe(mypipe); pid=fork(); if(pid<0){ perror("create process fai

lebronswift的博客 530

Linux 无名管道

无名管道(unnamed pipe)是一种进程间通信的方式,通常用于父子进程之间的通信。这是一个简单的示例,请根据实际情况进行相应的修改和扩展。

m0_58341340的博客 435

linux ipc 无名管道

介绍 1、无名管道是linux系统下的一种ipc通信机制。 2、在linux下一切皆文件,管道也不列外,管道也是一种特殊的文件,在使用pipe()方法申请的时候,会得到两个文件描述符,一个用于写,一个用于读,这个特殊的“文件”,你可以理解为在系统的内存空间申请了一块地址专门用来进行读写。 作用 1、 主要用于进程间的通信,但是这里注意这里的进程是具有特殊关系的亲信进程,比如父进程和子进程、父进程和孙子进程、兄弟进程。 2、为什么只能亲信进程之间使用管道进行IPC通信呢?

android 187

linux进程无名管道通信

linux进程无名管道通信 #include<stdio.h> #include<sys/types.h> #include<unistd.h> #include<stdlib.h> void pipe_read(int pipes[]); void pipe_write(int pipes[]); int main() { int pipes[2]; // pipes[0] 读取, pipes[1] 写入 pid_t pid; // pid_t 宏定义 int rc;

wuhui2356的博客 1万+
上一篇: 子进程复制了父进程的什么
下一篇: Qt注意事项
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值