FIFO ,又称命名管道,是Linux下(unix环境下)一种进程间通信的机制,应用广泛。
函数mkfifo 用于创建命名管道,使用命令man 3 mkfifo 可查看此函数信息。
FIFO创建后,可以像普通文件一样对其访问。
Linux下一个同名命令mkfifo 也用于创建FIFO,例如:
执行命令
$ mkfifo /tmp/fifo
$ cat /tmp/fifo
程序阻塞。
再打开一个shell,执行
$ echo hello > /tmp/fifo
前一个程序返回,显示hello
下面用一个简单程序,演示FIFO IPC的用法。
下载地址:http://download.csdn.net/source/2378181
该程序分为2端:
- server程序创建一个FIFO,并从FIFO读取字符,转换成大写后输出到屏幕。
- client程序读取用户输入并写入FIFO。
common.h
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #define FIFO_PATH "/tmp/myfifo"
server.c
- /*
- *将从FIFO收到到数据(字符)转换为大写,并输出到屏幕
- */
- #include "common.h"
- int main()
- {
- int ret;
- int fd;
- char buffer;
- int nread;
- int i;
- /*建立FIFO*/
- ret = mkfifo(FIFO_PATH, 0777);
- /*打开FIFO*/
- fd = open(FIFO_PATH, O_RDONLY);
- if(-1 == fd)
- {
- printf("error/n");
- return -1;
- }
- while(1)
- {
- nread = read(fd, &buffer, 1);
- if(nread > 0)
- {
- buffer = toupper(buffer);
- printf("%c", buffer);
- }
- }
- }
运行server后,可看到创建了文件/tmp/myfifo,这是mkfifo函数指定的命名管道的路径(名字)。
当然,系统不会真的在磁盘上创建这个文件。
client.c
- /*
- *读取输入,并写入FIFO
- */
- #include "common.h"
- int main()
- {
- int fd;
- int ret;
- char c;
- fd = open(FIFO_PATH, O_WRONLY);
- if(-1 == fd)
- {
- printf("error/n");
- return -1;
- }
- while(c = getchar())
- {
- write(fd, &c, 1);
- }
- }
先启动server程序,再运行client,随便输入些字符。
server端将在屏幕上显示转换为大写后的输入字符。
作者:ZhengZhiren
原文链接:http://blog.csdn.net/ZhengZhiRen/archive/2010/05/21/5613843.aspx