UNIX命名管道FIFO

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端:

  1. server程序创建一个FIFO,并从FIFO读取字符,转换成大写后输出到屏幕。
  2. client程序读取用户输入并写入FIFO。

 

common.h

  1. #include <stdio.h>   
  2. #include <sys/types.h>   
  3. #include <sys/stat.h>   
  4. #include <fcntl.h>   
  5. #define FIFO_PATH "/tmp/myfifo"  

 

 

server.c

  1. /* 
  2.  *将从FIFO收到到数据(字符)转换为大写,并输出到屏幕 
  3.  */  
  4. #include "common.h"   
  5. int main()  
  6. {  
  7.     int ret;  
  8.     int fd;  
  9.     char buffer;  
  10.     int nread;  
  11.     int i;  
  12.     /*建立FIFO*/  
  13.     ret = mkfifo(FIFO_PATH, 0777);  
  14.     /*打开FIFO*/  
  15.     fd = open(FIFO_PATH, O_RDONLY);  
  16.     if(-1 == fd)  
  17.     {  
  18.         printf("error/n");  
  19.         return -1;  
  20.     }  
  21.     while(1)  
  22.     {  
  23.         nread = read(fd, &buffer, 1);  
  24.         if(nread > 0)   
  25.         {  
  26.             buffer = toupper(buffer);  
  27.             printf("%c", buffer);  
  28.         }  
  29.     }  
  30. }  

 

运行server后,可看到创建了文件/tmp/myfifo,这是mkfifo函数指定的命名管道的路径(名字)。

当然,系统不会真的在磁盘上创建这个文件。

 

client.c

  1. /* 
  2.  *读取输入,并写入FIFO 
  3.  */  
  4. #include "common.h"   
  5. int main()  
  6. {  
  7.     int fd;  
  8.     int ret;  
  9.     char c;  
  10.     fd = open(FIFO_PATH, O_WRONLY);  
  11.     if(-1 == fd)  
  12.     {  
  13.         printf("error/n");  
  14.         return -1;  
  15.     }  
  16.     while(c = getchar())  
  17.     {  
  18.         write(fd, &c, 1);  
  19.     }  
  20. }  

 

先启动server程序,再运行client,随便输入些字符。

server端将在屏幕上显示转换为大写后的输入字符。

 

 

 

作者:ZhengZhiren

原文链接:http://blog.csdn.net/ZhengZhiRen/archive/2010/05/21/5613843.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值