您现在的位置是:首页 > 正文

有名管道与无名管道以及他们之间的区别

2024-02-01 03:33:51阅读 2

无名管道

1)特点

  1. 只能用于具有亲缘关系的进程之间的通信
  2. 半双工的通信模式,具有固定的读端和写端
  3. 管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数.
  4. 管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。

2)函数接口

int pipe(int fd[2])

功能:创建无名管道

参数:文件描述符 fd[0]:读端 fd[1]:写端

返回值:成功 0

              失败 -1

3)注意事项

  1. 当管道中无数据时,读操作会阻塞

  1. 管道中装满(管道大小64K)数据写阻塞,一旦有4k空间,写继续
  2. 只有在管道的读端存在时,向管道中写入数据才有意义。否则,会导致管道破裂,向管道中写入数据的进程将收到内核传来的SIGPIPE信号 (通常Broken pipe错误)。

练习:创建父子进程,实现数据交互。父进程从终端输入数据,子进程将数据输出,当输入quit结束进程。

fgets会在后面默认加一个\0

strlen计算长度遇到\0结束但是\n不会

3.有名管道

1.特点

  1. 有名管道可以使互不相关的两个进程互相通信。
  2. 有名管道可以通过路径名来指出,并且在文件系统中可见,但内容存放在内存中。
  3. 进程通过文件IO来操作有名管道
  4. 有名管道遵循先进先出规则
  5. 不支持如lseek() 操作

2.函数接口

int mkfifo(const char *filename,mode_t mode);

功能:创健有名管道

参数:filename:有名管道文件名

           mode:权限

返回值:成功:0

              失败:-1,并设置errno号

注意对错误的处理方式:

如果错误是file exist时,注意加判断,如:if(errno == EEXIST)

注:函数只是在路径下创建管道文件,往管道中写的数据依然写在内核空间。

3.注意事项

  1. 只写方式,写阻塞,一直到另一个进程把读打开
  2. 只读方式,读阻塞,一直到另一个进程把写打开
  3. 可读可写,如果管道中没有数据,读阻塞

有名管道和无名管道的区别:

无名管道

有名管道

使用场景

具有亲缘关系的进程间

不相关的进程间

特点

半双工通信,固定读端和写端

读端用fd[0],写端用fd[1]

通过文件IO进行操作(read、write)

在路径中存在一个管道文件

数据存放在内核空间,并不存在文件中

通过文件IO进行操作(open\read\write\close)

函数接口

pipe()

mkfifo()

注意事项

当管道中没有数据时,读阻塞

当写端关闭,管道中没有数据,读立刻返回;

管道有数据,可以将数据读出

当管道中写满数据,写阻塞

当管道中没有数据时,读阻塞

以只读的方式打开管道,另一个进程必须把写打开,才能读

以只写的方式打开管道,另一个进程必须把读打开,才能写

作业:

  1. 将今天课上代码再敲两遍。
  2. 通过有名管道实现cp功能;一个进程读源文件,另一个进程写目标文件。

./r file.c

./w test.c

【4】信号

网站文章

  • 特征工程之mushroom classification

    库import numpy as np # linear algebraimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)import matplotlib.pyplot as pltimport seaborn as snsfrom matplotlib.pyplot import figure...

    2024-02-01 03:33:44
  • 简单区分数据库之中的1NF、2NF、3NF、BCNF

    简单理解主属性、非主属性、部分函数依赖、完全函数依赖、传递函数依赖。简单区分1NF、2NF、3NF、4NF

    2024-02-01 03:33:40
  • 【ensp的OSPF多区域配置】

    【ensp的OSPF多区域配置】

    ensp是华为公司提供的一款模拟器,它可以在计算机上模拟出真实的华为网络设备,并支持OSPF协议的配置。OSPF(Open Shortest Path First)是一种开放式最短路径优先协议,它可以...

    2024-02-01 03:33:09
  • ChatGPT大更新!联网/插件功能无需排队,Plus用户下周即可体验

    ChatGPT大更新!联网/插件功能无需排队,Plus用户下周即可体验

    好消息,ChatGPT的联网和插件功能不用等了!OpenAI刚刚宣布,。具体来说,在最新的联网和插件Beta版中,ChatGPT会在设置里增加这样一个界面:回顾一下,网页浏览功能,能让ChatGPT不...

    2024-02-01 03:33:03
  • 如何配置 Kafka 无消息丢失

    如何配置 Kafka 无消息丢失

    kafka在三个阶段可能出现消息丢失,分别是生产消息、消费消息、页缓存操作后异步刷盘。

    2024-02-01 03:32:57
  • PgSQL——学习笔记三:创建&删除模式

    PgSQL——学习笔记三:创建&删除模式

    PostgreSQL 模式(SCHEMA) PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。 一个模式可以包含视图、索引、数据类型、函数和操作符等。 相同的对象名称可以被用于不同的模...

    2024-02-01 03:32:27
  • C++中指针的指针和二维数组相结合,实现动态分配内存、释放内存的写法

    C++中指针的指针和二维数组相结合,实现动态分配内存、释放内存的写法

    指向指针的指针和二维数组结合,申请、释放内存空间很是不好理解,理解了好大一会,才搞明白,把分析结果记录下来。1、下图是存储关系,帮助大家分析理解:2、以下是源代码,加了足够的注释:#include <...

    2024-02-01 03:32:19
  • Vue开发的仿美团外卖Html5前端页面

    Vue开发的仿美团外卖Html5前端页面

    今天给大家开源一个仿美团外卖的Vue项目,介绍Vue和vue-router的基本用法。 工程结构 工程目录结构比较简单,如下图所示。 运行效果 部分运行效果如下图,实现了基本的页面切换,导航菜单,购物车等功能。 如何运行 和其他的Vue项目一样,只需要下载源码,然后执行以下命令即可。 npm install npm run dev 源码链接 ...

    2024-02-01 03:32:12
  • MySQL的主备同步原理及过程

    MySQL的主备同步原理及过程

    主备同步流程图:

    2024-02-01 03:31:44
  • Linux常见命令

    注:要查看命令的具体使用,可以使用man查看命令帮助,如 man ls 1、login  登录系统   login [name][-p][-h 主机名称]一般打开系统,就会出现,localhost login:root   password:   为安全起见,输入密码时,字符不会在屏幕上回显,光标也不会移动。注:Linux是一个多用户操作系统,可以同时接受多个用

    2024-02-01 03:31:37