前言
上回书说到,为了实现无亲缘关系进程之间通信,可以使用有名管道, 那么这个有名管道相比无名管道,有什么不同的地方呢?
使用有名管道是会在文件系统中创建一个管道文件的。
无名管道中可没有提到过文件这个东西。
既然有名管道是以文件的方式存在的,那么不同进程之间当然可以通过读写这个文件来实现进程间通讯。
注:Linux下有7种文件类型:
文件类型 | 创建方法 |
---|---|
- 普通文件 | open() |
d 目录文件 | mkdir() |
l 链接文件(软链接) | ln -s |
p 命名管道文件 | mkfifo() |
s 套接字文件 | 还没学到 |
b 块设备文件,二进制文件 | 还没学到 |
c 字符设备文件 | 还没学到 |
前面几个我们都见过,ls -l
命令就可以看到每个文件的类型,其中的 p 就代表我们要说的有名管道文件类型。
有名管道
首先:我们需要创建一个管道文件:
int mkfifo(const char *pathname, mode_t mode);
该函数就是用来创建一个管道,返回值-1代表创建失败,0代表创建成功;参数:pathname
指明创建的管道文件目录和文件名,参数mode
指明文件权限,和普通文件创建时一样,我们可以写:0777。
写一个创建管道文件的程序,运行后可以看到我们创建好的管道文件:
文件名为:npipe
到这里,内核空间此刻还没有有名管道存在,需要等到调用open()函数才会出现。
创建好管道文件后,我们就可以进行进程间通信实验了
进程间通信实验
实现简单的一个功能:进程1工作完成后,向有名管道写一个标志位,通知进程2开始工作。
进程1源码:
#include <stdio.h>