管道

我们把从一个进程到另一个进程间的一个数据流称为一个"管道".

管道的本质是内核的一块缓存


其中管道又分为匿名管道和命名管道,两者之间的区别和联系又是什么呢?下面我们来看。

1.匿名管道

pipe函数:int pipe(int fd[2]);

                参数说明: fd:文件描述符,其中fd[0]表示读端,fd[1]表示写端

                返回值:成功返回为0,失败返回为错误代码


比如我们可以从键盘写入数据,写入管道,读取管道,写到屏幕上。

那么结合父子进程,我们可以用pipe创建一个进程,然后利用fork来创建一个子进程,然后让父进程读,子进程写,示意图如下:


下面是代码:

  1.#include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <string.h>
  5 
  6 int main()
  7 {
  8     int fds[2];
  9     pipe(fds); //创建管道
 10 
 11     if(fork() == 0) //子进程读取管道
 12     {
 13         close(fds[1]);//管道的读端是fds[0],所以关闭fds[1];
 14 
 15         char buf[100] = {0};
 16         read(fds[0],buf,100);//读取
 17         printf("child ,buf=[%s]\n", buf);
 18         close(fds[0]);
 19         exit(0);
 20     }
 21     else
 22     {
 23         close(fds[0]);
 24         char *msg = "this is maomaocj=ohng";
sleep(2);
 26         write(fds[1],msg,strlen(msg));
 27         close(fds[1]);
 28     }
 29 }

(此处和图中不一样,但是不影响,道理是一样的)

运行结果为:


pipe创建的管道只能适用于具有共同祖先的进程之间进行通信,而且数据只能向一个方向流动,不能进行双方互相通信,如果要实现双向通信就必需要建立两个管道。

而命名管道可以在不相关的进程间交换数据

2.命名管道

使用FIFO文件可以在不相关的进程间交换数据,被称为命名管道。

>>>命名管道有两种创建方式:

                                        命令行创建:  mkfifo filename


                                        程序里创建:int mkfifo(const *filename, mode_t mode);

>>>命名管道的打开方式

        如果当前打开是为了进行读操作而打开FIFO,     O_NONBLOCK  disable: 进行阻塞直到有进程读的时候才打开FIFO
                                                                                 O_NONBLOCK  enable: 立刻返回失败,返回错误码

下面用一段代码来实现文件的拷贝


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

1.匿名管道由Pipe函数进行创建并且打开

2.而命名管道由mkfifo函数进行创建,如果要打开要使用open

3.FIFO(命名管道)和pipe(匿名管道)之间的唯一区别,通过上述两点就看出来,他们的打开方式不一致,但是打开之后的工作方式是一致的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值