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将保证数据的原子性,否则相反。
匿名管道的特点
- 匿名管道只能用于具有亲缘关系的进程间的通信(常用于父子之间)
- 只能应用于单向通信
- 管道的生命周期随进程
- 管道是面向字节流的
- 内核会对管道操作进行同步与互斥
同步与互斥
同步:
按照特定的顺序访问
互斥:在任何时候使用独立资源时有且只有一个,互斥具有强烈的独占性和排他性
读写两端谁快谁等,只有一方操作完,另一方才能继续操作
可以利用两个管道实现双向通信
命名管道
如果在不具有亲缘关系的两个进程间通信,则使用命名管道,可以使用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]$
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
