特点:
1、半双工,数据在同一时刻只能在一个方向上流动。
2、写入FIFO中的数据遵循先入先出的规则。
3、FIFO所传送的数据是无格式的,这要求FIFO的读出方与写入方必须事先 约定好数据的格式, 如多少字节算一个消息等。
4、FIFO在文件系统中作为一个特殊的文件而存在,但FIFO中的内容却存放 在内存中。
5、管道在内存中对应一个缓冲区。不同的系统其大小不一定相同。
6、从FIFO读数据是一次性操作,数据一旦被读,它就从FIFO中被抛弃,释 放空间以便写更多的 数据。
7、当使用FIFO的进程退出后,FIFO文件将继续保存在文件系统中以便以后 使用。
8、FIFO有名字,不相关的进程可以通过打开命名管道进 行通信。
代码案例:
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char const *argv[])
{
// 创建有名管道(保证两个进程 识别相同目录)
mkfifo("my_fifo", 0666);
#ifdef WRITE
int fd = open("my_fifo", O_WRONLY);
#endif
#ifdef READ
int fd = open("my_fifo", O_RDONLY);
#endif
if (fd < 0)
{
perror("open");
return 0;
}
printf("读端open成功了\n");
#ifdef WRITE
// 循环写入数据
while (1)
{
// 获取键盘输入
char buf[128] = "";
printf("请输入需要发送的数据:\n");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = 0;
// 发送数据
write(fd, buf, strlen(buf));
// 退出循环
if (strcmp(buf, "bye") == 0)
{
break;
}
}
#endif
#ifdef READ
// 循环的读取数据
while (1)
{
char buf[128] = "";
read(fd, buf, sizeof(buf));
printf("收到数据:%s\n", buf);
// 退出循环
if (strcmp(buf, "bye") == 0)
{
break;
}
}
#endif
close(fd);
return 0;
}
运行结果: