首页 > 编程语言 >系统编程——管道通信

系统编程——管道通信

时间:2024-06-02 09:02:59浏览次数:29  
标签:读取 read 编程 通信 write 管道 有名

管道通信

Linux系统提供了一种通信方式,名字叫做管道通信,顾名思义,管道是单向的,比如水管、燃气管道等,换个说法就是管道是采用半双工通信的,也就是同一时刻只能完成发送数据或者接收数据。

匿名管道

匿名管道的特点是没有名称,所以用户无法使用open来创建和打开,但是匿名管道进行数据读写的方式和普通文件一样,都是支持read()/write()操作的。

匿名管道的创建

image
其中pipefd参数是一个数组类型,用于存储堆管道进行读写的文件描述符,pipefd[0]记录管道读取端的文件描述符,pipeifd[1]记录管道写入端的文件描述符
image

匿名管道的读写

对pipefd[0],pipefd[1]分别进行read与write的操作

有名管道

有名管道有文件名,可以被open,同样也支持read/write访问。

有名管道的创建

image
第一个参数是*const char *pathname,是创建的有名管道的文件路径
第二个参数是mode_t mode,是创建的有名管道的权限

有名管道的读写

open打开指定的有名管道后对其文件描述符进行read与write操作

管道读取数据的四种情况

image
image
image
image
总结:
如果一个管道的写端一直在写,而读端的引⽤计数是否⼤于0决定管道是否会堵塞,引用计数大于0,只写不读再次调用write会导致管道堵塞;
如果一个管道的读端一直在读,而写端的引⽤计数是否⼤于0决定管道是否会堵塞,引用计数大于0,只读不写再次调用read会导致管道堵塞;
而当他们的引用计数等于0时,只写不读会导致写端的进程收到一个SIGPIPE信号,导致进程终止,只写不读会导致read返回0,就像读到⽂件末尾⼀样。

思考:当一个管道写入10字节数据后,读取5字节数据,关闭管道再次打开,此时读取管道能否得到数据?

答:并不能读取到数据,进程阻塞直到写端有数据写入。因为管道通信是临时的内核缓冲区而不是持久化存储的通信方式,当其两个端口均关闭后,内容物会丢失。因此管道关闭后再打开是无法读取到之前尚未读取完毕的数据的。


管道间四种通信情况转载自:https://blog.csdn.net/skyroben/article/details/71513385

标签:读取,read,编程,通信,write,管道,有名
From: https://www.cnblogs.com/eon4051/p/18226750

相关文章

  • 深入理解Redis事务、事务异常、乐观锁、管道
    Redis事务与MySQL事务不一样。原子性:MySQL有UndoLog机制,支持强原子性,和回滚。Redis只能保证事务内指令可以不被干扰的在同一批次执行,且没有机制保证全部成功则提交,部分失败则回滚。隔离性:MySQL的隔离性指多个事务可以并发执行,MySQL有MVCC机制。而Redis没有,Redis是事务提交前......
  • 嵌入式Linux shell编程实例
    1.输入两个数,实现两个数的相加(1)具体实现代码如下1#!/bin/bash2reada3readb4sum=$(($a+$b))5echo"$sum"(2)编辑完内容后按Esc键再输入:wq保存,回车退出,执行结果如下图;(3)上图示例为输入两个数,实现两个数相加和,输出结果。2.计算1~100的和(1)具体实现代码......
  • 「网络编程」基于 UDP 协议实现回显服务器
    ......
  • Shell编程之免交互
    一、HereDocument免交互1.HereDocument概述        HereDocument是一个特殊用途的代码块。它在LinuxShell中使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如ftp、cat或read命令。HereDocument是标准输入的一种替代品,可以帮助脚本开发人员不必......
  • Linux-shell自动化编程
    1.常用命令解释器Shell命令解释器:bash编程. 编程环境准备 2.shell脚本执行方式 3.变量变量名字命名要求:1.不能以数字开头。2.不能以特殊符号开头,可以以"_"开头。3.推荐字母开头变量的命名方式:1.驼峰方式:personOfNamepersonOfAge2.✔现代式:单词(小......
  • 进程间通信(27000字超详解)
    ......
  • WebAssembly作为PLC(可编程逻辑控制器)引擎技术的10大优势
    WebAssembly(简称Wasm)是一种用于在现代Web浏览器中安全执行低级代码的二进制指令格式。它被设计为一种与语言无关的目标格式,这意味着可以用任何编程语言编写代码,然后编译成Wasm。将WebAssembly作为PLC(可编程逻辑控制器)IEC61131-3编程语言的的中间格式,可以带来一系列显著的优点,以下......
  • WebAssembly作为PLC(可编程逻辑控制器)引擎技术的10大优势
    WebAssembly(简称Wasm)是一种用于在现代Web浏览器中安全执行低级代码的二进制指令格式。它被设计为一种与语言无关的目标格式,这意味着可以用任何编程语言编写代码,然后编译成Wasm。将WebAssembly作为PLC(可编程逻辑控制器)的中间格式,可以带来一系列显著的优点,以下是一些主要的亮点:性......
  • shell编程扫盲
    大部分内容参考自清华大学出版社<<Linux编程>>,相关内容会随着笔者的不断学习而增量更新chatgpt能够完成shell编程的大部分内容,可以在阅读本文后向chatgpt提出需求,适当修改chatgpt给出的代码,再于测试环境进行排错,最后用于生产环境2.1Shell编程的基本概念shell是一种围绕......
  • Linux系统编程之线程
    一.线程介绍1.进程与线程典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。进程是程序执行时的一个实例,是担当分配系统资源(CP......