FIFO
来源:互联网 发布:数据帧大小 编辑:程序博客网 时间:2024/04/27 21:08
FIFO指代先进先出(first in, first out),Unix中的FIFO类似于管道。它是一个单向(半双工)数据流。不同于管道的是每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO。FIFO也称谓有名管道(named pipe)。
FIFO由mkfifo函数创建。
<span style="font-size:14px">#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode); 返回:成功时为0,出错时为-1</span>
FIFO创建完后,它必须或者打开来读或者打开来写。可以使用open或fopen函数打开。FIFO不能打开来既读又写,因为它是半双工的。
对管道或FIFO的write总是往末尾添加数据,对它们的read则总是从开通返回数据,如果对管道或FIFO调用lseek,那就会返回ESPIPE错误。
下面是一个简单的例子:
/* * main.cpp * * Created on: 2013-10-26 * Author: Richard */#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#define FIFO1 "/tmp/fifo.1"#define FIFO2 "/tmp/fifo.2"void client(int readfd, int writefd){ size_t len; size_t n; char buff[1024]; fgets(buff, 1024, stdin); len = strlen(buff); if (buff[len - 1] == '\n') { len--; } write(writefd, buff, len); while ((n = read(readfd, buff, 1024)) > 0) { write(STDOUT_FILENO, buff, n); }}void server(int readfd, int writefd){ int fd; ssize_t n; char buff[1025]; if ((n = read(readfd, buff, 1024)) == 0) { printf("End of file while reading pathname"); exit(0); } buff[n] = '\0'; if ((fd = open(buff, O_RDONLY)) < 0) { snprintf(buff + n, sizeof(buff) - n, "Cannot open, %s\n", strerror(errno)); n = strlen(buff); write(writefd, buff, n); } else { while ((n = read(fd, buff, 1024)) > 0) { write(writefd, buff, n); } close(fd); }}int main(int argc, char **argv){ int readfd, writefd; pid_t childpid; if ((mkfifo(FIFO1, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0) && (errno != EEXIST)) { printf("cannot create %s\n", FIFO1); return 0; } if ((mkfifo(FIFO2, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0) && (errno != EEXIST)) { unlink(FIFO1); printf("cannot create %s\n", FIFO2); return 0; } if ((childpid = fork()) == 0) { readfd = open(FIFO1, O_RDONLY, 0); writefd = open(FIFO2, O_WRONLY, 0); server(readfd, writefd); exit(0); } writefd = open(FIFO1, O_WRONLY, 0); readfd = open(FIFO2, O_RDONLY, 0); client(readfd, writefd); waitpid(childpid, NULL, 0); close(readfd); close(writefd); unlink(FIFO1); unlink(FIFO2); return 0;}
- FIFO
- FIFO
- fifo
- FIFO
- FIFO
- fifo
- FIFO
- FIFO
- fifo
- FIFO
- FIFO
- fifo
- FIFO
- FIFO
- FIFO(转)
- FIFO FIFOs
- IPC FIFO
- FIFO实例
- jfinal框架教程-学习笔记(一)
- jfinal框架教程-学习笔记(二)
- Oracle——Default pool 之cache特性 以及 测试default pool使用效果实验分享
- cannot be read or is not a valid ZIP file问题
- 拥有授权登录用户的应用程序设计
- FIFO
- linux+iNode 校园网客户端安装
- 大三了,意识到了数学、物理、外语的重要……
- ubuntu12.04全局代理
- 移植不再头痛:Android平台移植初解
- 【cocos2d-x 初学者学习篇】实现字符串 ,图片 ,按钮,动画
- [数据结构]程杰 线索二叉树代码
- qt-creator2.8.1 在 64bits笔记本上的环境搭建 桌面环境和 arm开发环境
- 外公与大外公在1942年