进程通信(1):无名管道(pipe)
无名管道(pipe)用来具有亲缘关系的进程之间进行单向通信。半双工的通信方式,数据只能单向流动。
管道以字节流的方式通信,数据格式由用户自行定义。
无名管道多用于父子进程间通信,也可用于其他亲缘关系进程间通信。
因为父进程调用fork函数创建子进程,子进程拷贝父进程的文件表,由于父子进程文件表内容相同,指向的file相同,所有最终父子进程操作的pipe管道相同。
父子进程都能看到pipe管道内存空间,所以父子进程能正常通信。进程通信的本质就是进程之间能够访问同一块内存。

父进程调用fork函数后,父子进程不能同时保留读写文件描述符,需要关闭读或者写文件描述符,形成单向数据流防止父子进程同时读写引发数据错误。
如果需要双向数据流,需要创建两个管道,然后关闭一个管道的读端和另一个管道的写端。
(1)创建管道1(fdl[0]和fdl[1])和管道2(fd2[0]和fd2[1]);(2) fork;(3)父进程关闭管道1的读出端(fd[0]);(4)父进程关闭管道2的写入端(fd2[l]);(5)子进程关闭管道1的写入端(fd[1]);(6)子进程关闭管道2的读出端(fd2[0]);

在下面程序中,父进程作为client,子进程作为server,使用两个匿名管道进行ipc通信。
首先父进程使用pipe创建两个管道pipe1和pipe2,然后使用fork创建子进程,在子进程中关闭pipe1的写端和pipe2的读端。在子进程中调用server函数,在父进程中调用client函数。
client函数读取标准输入的文件路径,然后使用write发送给管道;server使用read读取对应管道获取文件路径,然后打开文件,读取内容后使用write发送给另一个管道,然后client读取对应管道的文件内容输出到终端。
最后父进程调用waitpid回收结束的子进程。在调用waitpid之前,子进程处于僵尸状态,虽然没有占用内存空间,但是占用一定的资源。子进程结束后发送SIGCHLD信号给父进程,父进程默认是忽略这个信号,所以需要手动回收子进程。
#include "unpipc.h"void client(int, int), server(int, int);int main(int argc, char **argv)
{int pipe1[2], pipe2[2];pid_t childpid;Pipe(pipe1); /* create two pipes */Pipe(pipe2);if ( (childpid = Fork()) == 0) { /* child */Close(pipe1[1]);Close(pipe2[0]);server(pipe1[0], pipe2[1]);exit(0);}/* 4parent */Close(pipe1[0]);Close(pipe2[1]);client(pipe2[0], pipe1[1]);Waitpid(childpid, NULL, 0); /* wait for child to terminate */exit(0);
}
server.c
#include "unpipc.h"void
server(int readfd, int writefd)
{int fd;ssize_t n;char buff[MAXLINE+1];/* 4read pathname from IPC channel */if ( (n = Read(readfd, buff, MAXLINE)) == 0)err_quit("end-of-file while reading pathname");buff[n] = '\0'; /* null terminate pathname */if ( (fd = open(buff, O_RDONLY)) < 0) {/* 4error: must tell client */snprintf(buff + n, sizeof(buff) - n, ": can't open, %s\n",strerror(errno));n = strlen(buff);Write(writefd, buff, n);} else {/* 4open succeeded: copy file to IPC channel */while ( (n = Read(fd, buff, MAXLINE)) > 0)Write(writefd, buff, n);Close(fd);}
}
client.c
#include "unpipc.h"
void client(int readfd, int writefd)
{size_t len;ssize_t n;char buff[MAXLINE];/*4read pathname*/Fgets(buff, MAXLINE, stdin);len = strlen(buff); /* fgets() guarantees null byte at end */if (buff[len-1] == '\n')len--; /* delete newline from fgets() *//* 4write pathname to IPC channel */Write(writefd, buff, len);/* 4read from IPC, write to standard output */while ( (n = Read(readfd, buff, MAXLINE)) > 0)Write(STDOUT_FILENO, buff, n);
}
全双工管道
linux中可以使用socketpair创建一个全双工管道,但是在fd[0]写的数据只能在fd[1]读,在fd[1]写的数据只能在fd[0]读。

全双工管道是由两个半双工管道实现的,但是具体原理这本书上没有说(以后有机会找一下)
下面程序使用了全双工管道进行父子进程的通信:
父进程使用socketpair创建一个全双工管道,然后使用fork创建子进程。父进程向管道fd[1]端写入字符p,然后读取管道fd[1]的字符。子进程睡3秒后读取管道fd[0]的字符,然后向管道fd[1]写入字符c。
#include "unpipc.h"
#include <sys/types.h>
#include <sys/socket.h>
int
main(int argc, char **argv)
{int fd[2], n;char c;pid_t childpid;if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd) == -1){err_quit("create error");}Pipe(fd); /* assumes a full-duplex pipe (e.g., SVR4) */if ( (childpid = Fork()) == 0) { /* child */sleep(3);if ( (n = Read(fd[0], &c, 1)) != 1)err_quit("child: read returned %d", n);printf("child read %c\n", c);Write(fd[0], "c", 1);exit(0);}/* 4parent */Write(fd[1], "p", 1);if ( (n = Read(fd[1], &c, 1)) != 1)err_quit("parent: read returned %d", n);printf("parent read %c\n", c);exit(0);
}
相关文章:
进程通信(1):无名管道(pipe)
无名管道(pipe)用来具有亲缘关系的进程之间进行单向通信。半双工的通信方式,数据只能单向流动。 管道以字节流的方式通信,数据格式由用户自行定义。 无名管道多用于父子进程间通信,也可用于其他亲缘关系进程间通信。 因为父进程调用fork函…...
YOLOv10改进 | 损失函数篇 | SlideLoss、FocalLoss、VFLoss分类损失函数助力细节涨点(全网最全)
一、本文介绍 本文给大家带来的是分类损失 SlideLoss、VFLoss、FocalLoss损失函数,我们之前看那的那些IoU都是边界框回归损失,和本文的修改内容并不冲突,所以大家可以知道损失函数分为两种一种是分类损失另一种是边界框回归损失,…...
【数组、特殊矩阵的压缩存储】
目录 一、数组1.1、一维数组1.1.1 、一维数组的定义方式1.1.2、一维数组的数组名 1.2、二维数组1.2.1、二维数组的定义方式1.2.2、二维数组的数组名 二、对称矩阵的压缩存储三、三角矩阵的压缩存储四、三对角矩阵的压缩存储五、稀疏矩阵的压缩存储 一、数组 概述:数…...
Flat Ads:金融APP海外广告投放素材的优化指南
在当今全球化的数字营销环境中,金融APP的海外营销推广已成为众多金融机构与开发者最为关注的环节之一。面对不同地域、文化及用户习惯的挑战,如何优化广告素材,以吸引目标受众的注意并促成有效转化,成为了广告主们亟待解决的问题。 作为领先的全球化营销推广平台,Flat Ads凭借…...
DBA 数据库管理 表管理 数据批量处理。表头约束
表管理 建库 库名命名规则:仅可以使用数字、字母、下划线、不能纯数字 不可使用MySQL命令或特殊字符 库名区分字母大小写 加if not exists 命令避免重名报错 create database if not exists gamedb; 建表 drop database if exists gamedb ; 删表…...
C# 上位机开发之旅-委托事件的那些事[2]
上位机项目开发过程,应该不少遇见界面同步实时刷新的情况,设备的运行情况以及设备数据的实时更新,应用场景非常之多。 那么这个时候,我们就可以用到C#语言中的一些关键功能来实现,比如事件,委托,…...
浏览器出现 502 Bad Gateway的原理分析以及解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法 前言 此类问题主要作为疑难杂症 1. 问题所示 2. 原理分析 502 Bad Gateway 错误表示服务器作为网关或代理时,从上游服务器收到了无效的响应 通常出现在充当代理或网关的网络服务器上,例如 Nginx、Apache…...
Java的高级特性
类的继承 继承是从已有的类中派生出新的类,新的类能拥有已有类的属性和行为,并且可以拓展新的属性和行为 public class 子类 extends 父类{子类类体 } 优点 代码的复用 提高编码效率 易于维护 使类与类产生关联,是多态的前提 缺点 类缺乏独…...
pip install selenium异常
error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try brew install xyz, where xyz is the package you are trying to install. If you wish to install a Python library that isnt in Ho…...
应急响应总结
应急响应 日志 windows IIS 6.0 及更早版本: C:\WINDOWS\system32\LogFiles\W3SVC[SiteID]\ IIS 7.0 及更高版本: C:\inetpub\logs\LogFiles\W3SVC[SiteID]\ Apache HTTP Server C:\Program Files (x86)\Apache Group\Apache2\logs\ 或者 C:\Prog…...
一些资源(●ˇ∀ˇ●)
GPT Kimi.ai - 帮你看更大的世界 (moonshot.cn) 文心一言 (baidu.com) 搜索AI伙伴 (baidu.com) 讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞 (xfyun.cn) 秘塔AI搜索 (metaso.cn) GitHub打不开 下载Watt Toolkit...
WGCLOUD的ping设备监测可以导入excel数据吗
可以的 WGCLOUD的v3.5.3版本,已经支持导入excel数据,如下说明 数通设备PING监测使用说明 - WGCLOUD...
vue 画二维码及长按保存
需求 想要做如下图的二维码带文字,且能够长按保存 前期准备 一个canvas安装qrcode(命令:npm i qrcode) 画二维码及文字 初始化画布 <template><div><canvas ref"canvas" width"300" he…...
IDEA中Git常用操作及Git存储原理
Git简介与使用 Intro Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一款分布式版本控制系统(VSC),是团队合作开发…...
人工智能算法工程师(中级)课程4-sklearn机器学习之回归问题与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程4-sklearn机器学习之回归问题与代码详解。回归分析是统计学和机器学习中的一种重要方法,用于研究因变量和自变量之间的关系。在机器学习中,回归算法被广泛应用于…...
智能制造热点词汇科普篇——工业微服务
随着互联网技术的不断发展,近十年来,微服务也逐渐走进人们的视线中来。何为微服务?让我们先来看看百度百科上的定义:微服务(或称微服务架构)是一种云原生架构方法,在单个应用中包含众多松散耦合…...
FastGPT+OneAI接入网络模型
文章目录 FastGPT连接OneAI接入网络模型1.准备工作2.开始部署2.1下载 docker-compose.yml2.2修改docker-compose.yml里的参数 3.打开FastGPT添加模型3.1打开OneAPI3.2接入网络模型3.3重启服务 FastGPT连接OneAI接入网络模型 1.准备工作 本文档参考FastGPT的官方文档 主机ip接…...
Java核心篇之JVM探秘:内存模型与管理初探
系列文章目录 第一章 Java核心篇之JVM探秘:内存模型与管理初探 第二章 Java核心篇之JVM探秘:对象创建与内存分配机制 第三章 Java核心篇之JVM探秘:垃圾回收算法与垃圾收集器 第四章 Java核心篇之JVM调优实战:Arthas工具使用及…...
未来互联网的新篇章:深度解析Facebook的技术与战略
随着科技的飞速发展和社会的不断变迁,互联网作为全球信息交流的重要平台,正经历着前所未有的变革和演进。作为全球最大的社交媒体平台之一,Facebook不仅是人们沟通、分享和互动的重要场所,更是科技创新和数字化进程的推动者。本文…...
MySQL卸载 - Windows版
MySQL卸载 - Windows版 1. 停止MySQL服务 winR 打开运行,输入 services.msc 点击 “确定” 调出系统服务。 2. 卸载MySQL相关组件 打开控制面板 —> 卸载程序 —> 卸载MySQL相关所有组件 3. 删除MySQL安装目录 4. 删除MySQL数据目录 数据存放目录是在 …...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
