linux管道 匿名管道 命名管道 详解及用

管道

管道是文件,文件类型 为p 的是管道文件

管道文件的本质

两个不同的进程能看到一份公共的管道文件。

管道是一个进程连接到另一个进程的数据流。

匿名管道

匿名管道的创建


#include 函数:
int pipe(int fd[2])参数:fd数组 ,fd[0]表示读端,fd[1]表示写端
//存放的是两个文件的 fd返回值:成功返回为0 失败返回为-1
---
创建一个匿名管道

通过fork()共享创建管道,子进程继承父进程的内容,包括打开的文件。子进程不拷贝父进程打开文件的内容,仅有打开文件的信息。
所以父进成打开的文件子进程也打开。文件只有一份,存放于磁盘上
实例链接

  -srv pipe]$ ./pipe
child:已发送
parent:i am child!
child:已发送
parent:i am child!
child:已发送
parent:i am child!
child:已发送
parent:i am child!
child:已发送
parent:i am child!
child quit ! parent quit![wens@MiWiFi-R1CL-srv 

管道读写规则

当没有数据可读时

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,导致write进程退出

  • 如果写入的数据量大于PIPE_BUF,Linux将保证数据的原子性,否则相反。

匿名管道的特点
  1. 匿名管道只能用于具有亲缘关系的进程间的通信(常用于父子之间)
  2. 只能应用于单向通信
  3. 管道的生命周期随进程
  4. 管道是面向字节流的
  5. 内核会对管道操作进行同步与互斥
同步与互斥

同步
按照特定的顺序访问
互斥:在任何时候使用独立资源时有且只有一个,互斥具有强烈的独占性和排他性

读写两端谁快谁等,只有一方操作完,另一方才能继续操作

可以利用两个管道实现双向通信

命名管道

如果在不具有亲缘关系的两个进程间通信,则使用命名管道,可以使用FIFO文件来做

命名管道是一种特殊的文件

命名管道的创建

命名行创建
[wens@localhost mypipe]$ mkfifo mypipe//mkfifo 命令可以直接在命令行上创建一个命名管道文件
[wens@localhost mypipe]$ ls
client  client.c  makefile  mypipe  server  server.c
通过函数创建
       #include #include int mkfifo(const char *pathname, mode_t mode);//返回值:成功返回0 失败返回-1//参数 带环境变量的文件名  权限例:mkfifo("pipe",0644);//创建好后管道文件直接存在设定的路径 默认为当前路径
[wens@localhost mypipe]$ mkfifo mypipe
[wens@localhost mypipe]$ ls
client  client.c  makefile  mypipe  server  server.c

平常所用的“|”为匿名管道

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

  • 匿名管道由pipe创建
  • 命名管道由mkfifo创建,由open打开
  • 区别创建与打开方式不同

命名管道的打开规则:
如果当前进程是为读而打开FIFO
o_NONBLOCK disable
(阻塞):阻塞到直到有相应的进程为写而打开FIFO

o_NONBLOCK enable: 立刻返回成功

如果当前进程是为写而打开FIFO

o_NONBLOCK disable
(阻塞):阻塞到直到有相应进程为写而打开FIFO

o_NONBLOCK enable:
立刻返回失败,错误码为ENXIO

编写sever&&client通信实例

`
git hub 实例链接

[wens@localhost mypipe]$ ./client
please printf: 
hello
please printf: 
chishi
please printf: 
q
[wens@localhost mypipe]$ 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部