11、fifo,pipe简介

简介: 1、IPC的持久性 1)进程相关的:IPC中数据一直存在到最后一个关联进程关闭时 pipe、fifo等 2)内核相关的IPC:IPC中数据一直存在,除非内核重启或删除 消息队列,共享内存等 3)文件系统相关的IPC:IPC中数据一直存在,除非显式删除 文件 2、管道 匿名管道(p...

1、IPC的持久性

1)进程相关的:IPC中数据一直存在到最后一个关联进程关闭时

pipe、fifo

2)内核相关的IPCIPC中数据一直存在,除非内核重启或删除

消息队列,共享内存等

3)文件系统相关的IPCIPC中数据一直存在,除非显式删除

文件

2、管道

匿名管道(pipe):只能用于同一个祖先的进程组

有名管道(fifo):不相关的进程也可以使用

3、匿名管道

int pipe(int filedes[2]);

fildes[0]    用于从管道中读取数据

fildes[1]    用于将数据写入管道

不需要open,直接read/write 等系统调用

系统自动删除,进程不需要考虑

示例

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif View Code
#include "stdio.h"
#include
"stdlib.h"
#include
"unistd.h"
#include
"string.h"
int main(void)
{
int n, fd[2];
pid_t pid;
char line[512];
memset(line,
0, 512);
if (pipe(fd) < 0)
{
printf(
"pipe error");
}

if ((pid = fork()) < 0)
{
printf(
"fork error");
}
else if (pid > 0)
{
/* parent */
close(fd[
0]);
write(fd[
1], "hello\n", 13);
}
else
{
/* child */
close(fd[
1]);
n
= read(fd[0], line, 215);
printf(
"%s", line);
}
}

4、有名管道

int mkfifo(const char *pathname, mode_t mode);

pathname等参数和open类似

需要openopen必须只能是只读或只写。

open阻塞模式:阻塞到有进程以相对应方式打开相同的fifo

open非阻塞式:只读打开立刻返回;只写时,如果没有对应的进程已经只读打开相同的fifo,返回错误。

open之后才能read/write,操作与文件类似。

FIFO必须显式删除(调用unlink),但fifo中保存的数据是进程相关的

示例

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif View Code
#include "stdio.h"
#include
"stdlib.h"
#include
"unistd.h"
#include
"sys/types.h"
#include
"sys/stat.h"
#include
"fcntl.h"
#include
"string.h"
#define MAXLINE 256
int main(void)
{
int rfd, wfd;
pid_t pid;
char line[MAXLINE];

if (mkfifo("./fifo1", 0666) < 0)
{
printf(
"mkfifo error");
}

if ((pid = fork()) < 0)
{
printf(
"fork error");
}
else if (pid > 0)
{
/* parent */
if((wfd = open("./fifo1", O_WRONLY)) > 0 )
{
write(wfd,
"hello\n", 13);
close(wfd);
}
}
else
{
/* child */
if((rfd = open("./fifo1", O_RDONLY)) > 0 )
{
int n = read(rfd, line, MAXLINE);
printf(
"%s", line);
close(rfd);
}
}
}

5、写管道时,常数PIPE_BUF(一般为4096)规定了内核中管道缓存器的大小,如果写小于或等于PIPE_BUF大小的数据进入不会被打断,但大于PIPE_BUF的数据可能会被其他进程打断

关闭所有的写端,read返回0

关闭所有的读端,write会产生SIGPIPE信号

不能lseek,否则返回ESPIPE错误

参考

1http://linchunai1212.blog.163.com/blog/static/35112143201111361543958/

2http://www.linuxidc.com/Linux/2010-09/28317.htm

3http://www.dzsc.com/data/html/2009-9-10/78618.html

4http://blog.csdn.net/MONKEY_D_MENG/article/details/5570468

目录
相关文章
|
数据采集 小程序 前端开发
Python 制作天眼查小程序
Python 制作天眼查小程序
330 1
|
运维 安全 中间件
云计算万字长文 - 企业上云策略全览与最佳实践(长文)1
云计算万字长文 - 企业上云策略全览与最佳实践(长文)
875 0
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
MMAudio:开源 AI 音频合成项目,根据视频或文本生成同步的音频
MMAudio 是一个基于多模态联合训练的高质量 AI 音频合成项目,能够根据视频内容或文本描述生成同步的音频。该项目适用于影视制作、游戏开发、虚拟现实等多种场景,提升用户体验。
514 8
MMAudio:开源 AI 音频合成项目,根据视频或文本生成同步的音频
|
10月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
309 2
|
11月前
|
机器学习/深度学习 Serverless 定位技术
深入理解多重共线性:基本原理、影响、检验与修正策略
本文将深入探讨多重共线性的本质,阐述其重要性,并提供有效处理多重共线性的方法,同时避免数据科学家常犯的陷阱。
533 3
|
XML API 数据安全/隐私保护
PyMuPDF 1.24.4 中文文档(七)(1)
PyMuPDF 1.24.4 中文文档(七)
178 0
|
前端开发 搜索推荐 Java
开源项目的 README.md 这样写,hr 看了都心动
开源项目的 README.md 这样写,hr 看了都心动
610 2
可以使用 UNION 或者 UNION ALL 来合并多个 SELECT 语句的结果
可以使用 UNION 或者 UNION ALL 来合并多个 SELECT 语句的结果
347 7
|
缓存 负载均衡 Dubbo
深入理解Dubbo-3.高级功能剖析和原理解析
深入理解Dubbo-3.高级功能剖析和原理解析
216 0
|
运维 Cloud Native 安全
对话阿里云叔同:如何看待 2022 年云原生的发展,2023 年有哪些值得关注的技术?
本次对话,希望通过阿里云云原生应用平台负责人丁宇(叔同)的观察和理解,帮助更多的企业决策者厘清技术价值,提供借鉴参考。
591 106