有名管道解决了无名管道进程只能是具有情缘关系的问题。
一、有名管道无名管道是临时的,通信完成后自行消失。有名管道或者叫做命名管道(named pipe),可以实现没有亲缘关系的进程间通信,方法是使用FIFO文件。
1.1 shell中使用有名管道一般而言,Linux中的fifo文件存储在/tmp/my_fifo, shell中可以直接创建fifo:
sudo mkfifo abc
然后进行读取和写入:
cat < /tmp/abc & #让FIFO立刻打印收到的内容 echo "Hello world" > /tmp/abc #需要root权限,注意不是sudo权限
cat < filename将文件的内容打印至标准输出,如果此时另一进程将内容写至fifo文件可以直接在终端观察到管道的内容。
1.2 mkfifo创建有名管道除了在shell中直接创建外,在C/C++程序中使用mkfifo接口创建:
#include #include int mkfifo(const char * filename, mode_t mode);
输入参数:
const char * filename 要打开的fifo文件
mode_t mode 打开模式
mode 含义 O_RDONLY 只读 O_WRONLY 只写 O_NONBLOCK 非阻塞如以只读非阻塞方式打开文件,O_RDONLY|O_NONBLOCK。
在没有设置O_NONBLOCK时,读写都可能出现阻塞:
- read当文件为空时阻塞都关闭时,才会立刻返回0。
read是阻塞还是非阻塞读取取决于设备的设置,默认情况都是阻塞读取。
- write当文件为满阻塞
FIFO文件大小一般为4096byte(4kb)在系统头文件limits.hPIPE_BUF宏定义。
输出参数 返回一个实际读取的字节数n(n
关注
打赏
