C 语言编程 — 管道(Pipe)

举报
云物互联 发表于 2021/08/06 00:55:07 2021/08/06
【摘要】 目录 文章目录 目录Linux 的管道指令C 语言的匿名管道命名管道匿名管道和命名管道的区别参考文档 Linux 的管道指令 如果你熟悉 Linux,那么你对管道应该不会感到陌生,我们经常会使用 “|” 来使用管道。但是管道的真正定义是什么呢? 管道是一个进程连接数据流到另一个进程的通道,它通常用作把一个进程的输出通过管道连接到另一个进程的输入。 ...

目录

Linux 的管道指令

如果你熟悉 Linux,那么你对管道应该不会感到陌生,我们经常会使用 “|” 来使用管道。但是管道的真正定义是什么呢?

  • 管道是一个进程连接数据流到另一个进程的通道,它通常用作把一个进程的输出通过管道连接到另一个进程的输入

例如:ls -l | grep string

C 语言的匿名管道

C 语言的匿名管道 pipe() 定义在头文件 unistd.h 中。

int pipe(filedes[2]);

  
 
  • 1
  • filedes[2]:用于接收 pipe 返回的两个文件描述符:filedes[0] 为读管道、filedes[1] 诶写管道。
  • 返回值:成功返回 0,失败返回 -1,并设置了 errno。

匿名管道实质上是一个先进先出(FIFO)的队列:filedes[0] 是队头(front),filedes[1] 则作为队尾(rear)。pipe() 创建的管道,本质是一个内核缓冲区,该缓冲区的大小一般为一页,即 4K 字节。

命名管道

通过匿名管道来在进程之间传递数据存在一个缺陷,就是这些进程都由一个共同的父进程启动,这不便于我们在不相关的两个进程之前交换数据,所以 C 语言进入了 “命名管道”,用于解决不相关进程间的通信问题;

命名管道也被称为 “FIFO 文件”,它是一种特殊类型的文件,在文件系统中以文件名的形式存在,它的行为与匿名管道类似。因为在 Linux 中一切皆文件,所以命名管道的使用与文件的操作方式基本一致,可以在命令行中使用。

可以使用以下两个函数之一来创建一个命名管道:

  1. 头文件 sys/types.h、sys/stat.h 中定义的:
int mkfifo(const char *filename, mode_t mode);
int mknod(const char *filename, mode_t mode | S_IFIFO, (dev_t)0);

  
 
  • 1
  • 2

这两个函数都能创建一个 FIFO 文件,注意,是真的创建了一个真实存在于文件系统中的文件,filename 指定了文件名,而 mode 则指定了文件的读写权限。

  1. 可以直接在 Shell 中使用命令 mkfifo、mknod 来创建一个 FIFO 文件:
$ mkfifo fifo_file
$ mknod fifo_file p

  
 
  • 1
  • 2

匿名管道和命名管道的区别

使用匿名管道,通信的进程之间需要一个父子关系,通信的两个进程一定是由一个共同的祖先进程启动,匿名管道没数据交叉的问题;

使用命名管道的两个进程可不存在 “血缘” 关系,但为了保证数据的安全,我们很多时候要采用阻塞的 FIFO,让写操作变成原子操作;

参考文档

https://www.zfl9.com/c-ipc-pipe.html

文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。

原文链接:is-cloud.blog.csdn.net/article/details/106152294

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。