我们把从一个进程到另一个进程间的一个数据流称为一个"管道".
管道的本质是内核的一块缓存
其中管道又分为匿名管道和命名管道,两者之间的区别和联系又是什么呢?下面我们来看。
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);
>>>命名管道的打开方式
下面用一段代码来实现文件的拷贝
3.匿名管道与命名管道的区别
1.匿名管道由Pipe函数进行创建并且打开
2.而命名管道由mkfifo函数进行创建,如果要打开要使用open
3.FIFO(命名管道)和pipe(匿名管道)之间的唯一区别,通过上述两点就看出来,他们的打开方式不一致,但是打开之后的工作方式是一致的