命名管道fifo()
FIFO可以用于没有血缘关系的进程间通信。FIFO是Linux基本文件类型的一种,文件类型为p。
简单来说,FIFO可以理解为一个特殊的文件,创建它之后,可以使用 ls或ll来进行查看文件基本信息。
FIFO就是标识内核的一条管道,进程可以通过read/write进行读写操作。实际就是进程间在对内核缓冲区在进行读写操作从而进行通信。
注意事项 :这里mkfifo函数的路径需要时Linux本地文件夹下,不能是挂载的文件夹路径,此外需要当前用户有相应权限,如果没有权限可以使用sudo利用root角色来执行
还可以使用命令的方式来提前创建fifo文件
sudo mkfifo ./mfifo
或者使用函数mkfifo()进行创建
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
第一个参数是创建fifo的路径,第二个参数是fifo的权限
返回值
等于0 创建成功
其他 创建失败,由下面进行判断具体原因
EACCES 路径名中的一个目录不允许搜索(执行)权限
EDQUOT 用户在文件系统上的磁盘块或索引节点配额已用完。
EEXIST 路径名已存在。
ENAMETOOLONG 路径名的总长度大于PATH_MAX,或者单个文件名组件的长度大于NAME_MAX。
ENOENT 路径名中的目录组件不存在
ENOSPC 目录或文件系统没有空间容纳新文件。
ENOTDIR 在路径名中用作目录的组件实际上不是目录。
EROFS 路径名只读
fifo_write.c
//fifo_write.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
int ret = mkfifo("/home/myfifo", 0777);
if (ret != 0)
{
perror("mkfifo error");
return -1;
}
int fd = open("/home/myfifo",O_RDWR);
if (fd<0)
{
perror("open error");
return -1;
}
int i = 0;
char buf[64];
while(1)
{
memset(buf, 0x00, sizeof(buf));
sprintf(buf, "%d:%s", i, "hello");
write(fd, buf, strlen(buf));
sleep(1);
i++;
}
//关闭文件
close(fd);
return 0;
}
fifo_read.c
//fifo_read.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
int fd = open("/home/myfifo",O_RDWR);
if (fd<0)
{
perror("open error");
return -1;
}
char buf[64];
while(1)
{
memset(buf, 0x00, sizeof(buf));
ssize_t len = read(fd, buf, sizeof(buf));
printf("str len is [%ld], [%s]\n",len,buf);
}
//关闭文件
close(fd);
return 0;
}