kunyashaw博客主页 关注kunyashaw新博客 关于kunyashaw 转到底部

linux ipc——fifo

1、概念

命名管道:

2、用途

命名管道用的最多的地方就是进程间通信,它的原理是通过文件映射的方式实现的,进程间数据的传输直接在内存中进行,所以它的效率是很高的。

3、特点

6个,3-5同无名管道。

①存在文件系统(支持open、close、read、write)

②fifo文件存在于文件系统,但内容存在于内存,故大小受限制,缓冲区大小为4kb

③有名字

④数据无格式

⑤一次性操作

⑥执行完io操作之后,fifo文件继续存在与文件系统中

 

4、使用方法

FIFO文件的创建
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo( const char *pathname, mode_t mode);
 参数:
pathname:FIFO的路径名+文件名。
mode:mode_t类型的权限描述符。
 返回值:
成功:返回 0
失败:如果文件已经存在,则会出错且返回-1。

5、举例

复制代码
 1 #include <stdio.h>
 2 
 3 #include <sys/types.h>
 4 
 5 #include <sys/stat.h>
 6 
 7 #include <fcntl.h>
 8 
 9 #include <string.h>
10 
11 int main(int argc,char*argv[])
12 
13 {
14 
15   int fd;
16 
17   int ret;
18 
19   char buf[200]="";
20 
21   ret = mkfifo("my_fifo", S_IRUSR|S_IWUSR);
22 
23   if(ret < 0)
24 
25   {
26 
27     perror("mkfifo");
28 
29   }
30 
31   fd= open("my_fifo",O_RDWR|O_CREAT);
32 
33   if(fd < 0)
34 
35   {
36 
37     perror("open");
38 
39   }
40 
41   bzero(buf,sizeof(buf));// memset(buf,0,sizeof(buf));
42 
43   strcpy(buf,"hello china\n");
44 
45   ret=write(fd,buf,strlen(buf));
46 
47   if(ret < 0)
48 
49     perror("write to fifo");
50 
51   bzero(buf,sizeof(buf));// memset(buf,0,sizeof(buf));
52 
53   ret=read(fd,buf,sizeof(buf));
54 
55   if(ret < 0)
56 
57     perror("read from fifo");
58 
59   printf("buf read form my_fifo is %s\n",buf);
60 
61  
62 
63 }
64 
65  
66 
67  
复制代码

 

posted @   kunyashaw  阅读(272)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
回到顶部
点击右上角即可分享
微信分享提示