管道是在本机上进程间通信
如果不用今天学的管道进行进程间通信
使用file.txt,a把数据写到文件中,b从文件中把数据读出来
这个方式:这个file.txt在磁盘上存放,访问速度非常慢
磁盘慢,内存快一些,缓存更快,寄存器更更快,但是小
对于管道文件,打开以后,是在内存中创建一个空间
管道可以用来在两个进程之间传递数据,如: ps -ef | grep “bash”, 其中‘|’就是管道,其作用就是将 ps 命令的结果写入管道文件,然后 grep 再从管道文件中读出该数据进行过滤。
有名管道
有名管道可以在任意两个进程之间通信
有名管道的创建:
命令创建: mkfifo FIFO
系统调用创建
#include <sys/types.h>
#include <sys/stat.h>
//filename 是管道名 mode 是创建的文件访问权限
int mkfifo(const char *filename, mode_t mode);
下面是命令创建有名管道
ls -l查看
这里的p就是管道类型的文件
必须有一个读端和一个写端,才可以通信
两个进程要同时打开
否则就阻塞,不让打开
open write read close
虽然可以看到这个管道文件
但是这个管道文件大小永远为0
不会把数据写到磁盘上,在内存上
编写a.c
编写b.c
gcc -o a a.c
dcc -o b b.c
./b
在另外一个终端的相同位置:./a
对方如果关闭管道,直接返回
read==0作为判断对方关闭管道的条件
循环写入读取需要这个条件
vi a.c
vi b.c
在两个终端分别运行这两个程序
允许多个读和写
改成一次只读一个字节
我们打开管道后,会给内存分配空间,划分一个字节一个字节
头指针和尾指针控制
写入数据,头指针往后移动
读取数据,尾指针往后移动
类似于顺序循环队列
写满了。write会阻塞
空的话,read会阻塞
管道的特点
1、无论有名还是无名,写入管道的数据都在内存中
2、管道是一种半双工通信方式(通信方式有单工、半双工、全双工)
3、有名和无名管道的区别:有名可以在任意进程间使用,而无名主要在父子进程间
Ctrl+c,进程结束,所有打开的文件描述符自动关闭把a关闭,写端关闭,b读端返回值为0,正常退出
如果把b关闭,读端关闭,a写入数据就退出了,往关闭的管道写数据,没人读,内核认为产生异常,发送信号,通知结束进程
在写端加上信号函数
如果又有读端了
无名管道
无名管道主要应用于父子进程间的通信
无名管道的创建:
这个是固定的
运行后如下
打印fd[0],fd[1]
为什么是3,4
其实就是文件表的下标值