- 有名管道与无名管道对比,在于创建了一个FIFO文件,即使没有亲缘关系的进程,也可通过访问FIFO文件进行数据的交互。
- FIFO是先入先出,与普通文件的操作一样,通过read()/write()/close()函数对其进行操作。
- FIFO文件不会删除,会一直存在于文件系统中。
- 函数原型
-
#include <sys/types.h> #include <sys/stat.h> //创建FIFO文件 int mkfifo(const char * pathname, mode_t mode); //参数含义 pathname: 管道名称路径 mode :文件的权限 //返回值 成功返回0;失败返回-1
- 扩展知识
#include <unistd.h> int access(const char * pathname, int mode); //作用:判断一个文件是否存在。 //参数 pathname: 需要判断是否存在的文件路径名 mode :需要判断的操作模式 //mode的值 R_OK 测试读许可权 W_OK 测试写许可权 X_OK 测试执行许可权 F_OK 测试文件是否存在 //返回值 成功执行:返回0;失败:返回-1。errno被设为以下的某个值 EINVAL: 模式值无效 EACCES: 文件或路径名中包含的目录不可访问 ELOOP : 解释路径名过程中存在太多的符号连接 ENAMETOOLONG:路径名太长 ENOENT: 路径名中的目录不存在或是无效的符号连接 ENOTDIR:路径名中当作目录的组件并非目录 EROFS: 文件系统只读 EFAULT: 路径名指向可访问的空间外 EIO: 输入输出错误 ENOMEM: 不能获取足够的内核内存 ETXTBSY:对程序写入出错
- 写FIFO文件(mkfifo_write.c)
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int main(void){ int rst = access("myFIFO", F_OK);//首先判断该文件是否存在 if(rst == -1){ printf("文件不存在!\n"); int ret = mkfifo("test", 0777); if(ret == -1){ perror("mkfifo创建失败!\n"); exit(0); } } //以只写的方式创建管道 int fd = open("test", O_WRONLY); if(fd == -1){ perror("以只写的权限打开文件失败!\n"); exit(0); } //向FIFO中写入数据 for(int i = 0; i < 20; i++) { char buf[1024]; sprintf(buf, "hello, %d\n", i);//将数据写入buf中 printf("写入的数据为 : %s\n", buf); write(fd, buf, strlen(buf));//将数据写入到FIFO文件中 sleep(1);//延时1s } close(fd);//使用完关闭文件 //手动删除文件,方便下次能继续创建,否则的话文件存在,无法运行 remove("myFIFO"); return 0; }
- 读FIFO文件(mkfifo_read.c)
-
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int main(void){ //由于FIFO文件已经创建,故不必再创建 //以只读方式打开FIFO文件 int fd = open("myFIFO", O_RDONLY); if(fd == -1){ perror("以只读方式打开FIFO文件失败!\n"); exit(0); } //读取FIFO中的数据 while(1){ char buf[1024]; int len = read(fd, buf, sizeof(buf)); if(len == 0){ //说明数据全部已被读出 break;//跳出死循环 } printf("读取的数据是: %s\n", buf); } close(fd);//最后关闭文件 return 0; }
- 实验结果:实现了两个无亲缘关系的进程间的通信(一个进程发数据,另一个进程接收数据)
- 今天就记录到这里,后续遇到需要补充后的再进行添加。
进程通信--有名管道
最新推荐文章于 2024-08-16 17:08:36 发布