当前位置: 首页 > news >正文

[Linux] 进程间通信

进程间通信(Inter-Process Communication, IPC)是指不同进程之间的数据交换与协作。在Linux中,进程间通信有多种方式,每种方式都有其适用的场景。本文将介绍Linux中常见的几种进程间通信方法:管道(Pipe)、命名管道(Named Pipe)、消息队列、共享内存和信号。

1. 管道(Pipe)

管道是最常见的进程间通信方式之一,允许一个进程将输出数据通过管道传递给另一个进程。管道提供的是字节流的通信方式,数据按顺序流动。

匿名管道:只能在父子进程之间使用,通过pipe()系统调用创建。父进程写入数据,子进程从管道中读取。

int fd[2];
pipe(fd);
write(fd[1], "Hello, Pipe!", 12);
char buffer[12];
read(fd[0], buffer, 12);

命名管道:可以在任意进程之间通信,通过mkfifo()函数创建命名管道。

mkfifo("/tmp/myfifo", 0666);
int fd = open("/tmp/myfifo", O_RDONLY);

2. 消息队列(Message Queues)

消息队列提供了一个按消息顺序存储和传递数据的机制。通过msgget()msgsnd()msgrcv()等系统调用操作消息队列。与管道不同,消息队列是基于消息而非字节流的,支持多种进程同时访问。

 
int msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
struct msgbuf {long mtype;char mtext[100];
};
msgsnd(msgid, &msg, sizeof(msg), 0);
msgrcv(msgid, &msg, sizeof(msg), 0, 0);

3. 共享内存(Shared Memory)

共享内存允许多个进程共享同一块内存区域,效率高于其他IPC机制。通过shmget()shmat()shmdt()shmctl()等系统调用进行操作。共享内存需要借助信号量或互斥锁来实现进程间的同步和互斥。

 
int shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0666);
char *shm = shmat(shmid, NULL, 0);
strcpy(shm, "Shared memory message");
shmdt(shm);

4. 信号(Signals)

信号是Linux中用来通知进程某种事件发生的机制。信号可以由内核或其他进程发送。常见的信号有SIGINT(中断信号)、SIGKILL(终止信号)等。进程可以通过signal()sigaction()系统调用注册信号处理函数。

 
signal(SIGINT, sig_handler);

5. 套接字(Sockets)

套接字是用于进程间通信的一种更强大的机制,它不仅可以在同一台机器上使用,还可以跨网络进行通信。通过socket()bind()listen()accept()send()recv()等系统调用进行套接字操作。常见的通信方式有TCP/IP和UNIX域套接字。

 
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen(sockfd, 5);

总结

Linux提供了丰富的进程间通信机制,选择合适的IPC方式取决于应用的需求。管道和消息队列适用于简单的数据传递,共享内存适合大数据量的高速传输,信号适用于异步事件的通知,而套接字则适合跨网络或不同主机的通信。

了解这些IPC方式,有助于在设计进程间协作时做出更有效的决策,提高系统的性能和可靠性。

相关文章:

[Linux] 进程间通信

进程间通信(Inter-Process Communication, IPC)是指不同进程之间的数据交换与协作。在Linux中,进程间通信有多种方式,每种方式都有其适用的场景。本文将介绍Linux中常见的几种进程间通信方法:管道(Pipe&…...

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数

CL13 最大的数(20 分) 输入一个有 n 个无重复元素的整数数组 a&#xff0c;输出数组中最大的数。提示&#xff1a;如使用排序库函数 sort()&#xff0c;需要包含头文件#include 。输入&#xff1a; 第一行是一个正整数 n(2<n<20)&#xff1b; 第二行包含 n 个不重复的整…...

【Linux】sudo make install 命令往系统中安装了什么 指定目录进行安装

前情提要 假如我们通过源码安装的方式&#xff0c;安装一个动态库&#xff0c;风格往往是这样的&#xff1a; # 克隆仓库 git clone https://github.com/xxx.git# 进入仓库目录 cd xxx编译 # ... 可能有一些校验代码完整性的sh命令# 构建 mkdir build cd build cmake ..# 编…...

RT-DETR融合CVPR[2020]轻量化卷积模块Ghost Module模块

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《GhostNet: More Features from Cheap Operations》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/1911.11907 代码链接&#xff1a;GitHub - huawei-noah/Effici…...

发布rust crate

文章目录 一、cargo构建的配置类型&#xff1a;dev与release两种1.编译级别2.将 crate 发布到 Crates.io对整个库的注释pub use再导出功能发布crates.io 参考 一、cargo构建的配置类型&#xff1a;dev与release两种 $ cargo buildFinished dev [unoptimized debuginfo] targe…...

Sequelize+Sqlite3使用示例

以下是一个简单的示例&#xff0c;展示了如何在Node.js中使用Express框架、Sequelize ORM以及SQLite数据库来构建一个支持RESTful API的Web应用程序。 一&#xff0c;安装必要的npm包&#xff1a; npm install express sequelize sqlite3 body-parser 二&#xff0c;创建Jav…...

MyBatisPlus 用法详解

MyBatisPlus 用法详解 MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。它提供了丰富的功能&#xff0c;包括强大的CRUD操作、条件构造器、自动填充、分页插件等&…...

强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习&#xff0c;本科时已经学习过了&#xff0c;但是感觉还是有些概念和算法没有学懂学透&#xff0c;所以想重新系统性的学习一下&#xff0c;记录了整个学习过程&#xff0c;而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…...

C++ QT 工具日志异步分批保存

C QT 工具软件一般可以如此实现日志保存&#xff1a; #define THREAD_ID (reinterpret_cast<qulonglong>(QThread::currentThreadId()) & 0x0FFF) #define TIME (QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss_zzz"))#define LOGD(msg) qD…...

win32com库基于wps对Word文档的基础操作

win32com库基于wps对Word文档的基础操作 文章目录 win32com库基于wps对Word文档的基础操作新建/打开文档段落操作(Paragraph)字体设置(Font)图表操作(Shape) 参考链接: WAS API手册 新建/打开文档 import win32com import win32com.client as win32 # 启动WPS进程 word_obj …...

Kubernetes 网络之深度探索:网络模型与 CNI 插件

Kubernetes 网络之深度探索:网络模型与 CNI 插件 在 Kubernetes 中,网络是一个至关重要的组成部分。它不仅决定了容器之间如何通信,还影响着整个集群的可扩展性和稳定性。本节课将深入剖析 Kubernetes 的网络模型以及 CNI(Container Network Interface)网络插件。 一、K…...

Go 模块管理教程:go.mod 与依赖版本控制

Go 模块管理教程&#xff1a;go.mod 与依赖版本控制 Go 从版本 1.11 开始引入了 Go Modules&#xff0c;通过 go.mod 文件来管理项目的依赖关系和版本。Go 模块系统大大简化了 Go 项目的依赖管理&#xff0c;解决了之前 GOPATH 模式的许多问题。本教程将介绍如何使用 Go 模块管…...

大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)

大数据 ETL Flume 数据清洗 — 详细教程及实例 1. ETL 和 Flume 概述1.1 ETL&#xff08;Extract, Transform, Load&#xff09;1.2 Flume 概述 2. Flume 环境搭建2.1 下载并安装 Flume2.2 启动 Flume 3. Flume 配置和常见 Source、Sink、Channel3.1 Flume Source3.2 Flume Si…...

鸿蒙next版开发:订阅应用事件(ArkTS)

在HarmonyOS 5.0中&#xff0c;ArkTS提供了强大的应用事件订阅机制&#xff0c;允许开发者订阅和处理系统或应用级别的事件。这一功能对于监控应用行为、优化用户体验和进行性能分析至关重要。本文将详细介绍如何在ArkTS中订阅应用事件&#xff0c;并提供示例代码进行说明。 应…...

F litter 开发之flutter_local_notifications

flutter_local_notifications 消息通知 flutter_local_notifications地址 flutter_local_notifications: ^18.0.1class NotificationHelper {//工厂模式调用该类时&#xff0c;默认调用此方法&#xff0c;将实例对象返回出去static NotificationHelper? _instance null;sta…...

springboot参数校验

springboot 参数校验 Validated 以及 Valid - 唏嘘- - 博客园 SpringBoot参数校验Validated、Valid_springboot validate-CSDN博客...

Spring生态学习路径与源码深度探讨

引言 Spring框架作为Java企业级开发中的核心框架&#xff0c;其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身&#xff0c;更需要深入理解其周边组件和工具&#xff0c;以及源码的底层实现逻辑。本文将从Spring生态的学…...

C++:set详解

文章目录 前言一、set概念介绍二、set的使用1. 插入删除相关2. 查找相关1&#xff09;find2&#xff09;count3&#xff09;lower_bound与upper_bound4&#xff09;equal_range 三、set的值是不能修改的原理四、基于哈希表的set总结 前言 根据应用场景的不同&#xff0c;STL总…...

(一)- DRM架构

一&#xff0c;DRM简介 linux内核中包含两类图形显示设备驱动框架&#xff1a; FB设备&#xff1a;Framebuffer图形显示框架; DRM&#xff1a;直接渲染管理器&#xff08;Direct Rendering Manager&#xff09;&#xff0c;是linux目前主流的图形显示框架&#xff1b; 1&am…...

Docker了解

Docker是一种容器化技术&#xff0c;它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中&#xff0c;以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术&#xff0c;可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 Docker的基本概念包括…...

机器学习在轨道预测中的应用:两阶段模型实现精度与效率的平衡

1. 项目概述与核心挑战在低地球轨道&#xff08;LEO&#xff09;上&#xff0c;成千上万的卫星和空间碎片正以每秒数公里的速度高速飞行。精确预测它们未来的位置——轨道预测——是确保航天器安全、避免碰撞以及进行有效空间交通管理的基石。传统上&#xff0c;这项工作依赖于…...

如何快速获取网盘直链:LinkSwift 下载助手配置指南

如何快速获取网盘直链&#xff1a;LinkSwift 下载助手配置指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

解锁AMD Ryzen隐藏性能:一款开源调试工具如何让你成为硬件调优高手

解锁AMD Ryzen隐藏性能&#xff1a;一款开源调试工具如何让你成为硬件调优高手 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...

JMeter压测5大底层优化:线程模型、HTTP连接、Groovy脚本、JVM参数与分布式协同

1. 为什么90%的JMeter脚本在压测中“假成功”——从一个被忽略的线程组配置说起你有没有遇到过这样的情况&#xff1a;脚本在JMeter GUI里跑得飞快&#xff0c;聚合报告里TPS稳稳上200&#xff0c;响应时间平均80ms&#xff0c;看起来一切完美&#xff1b;可一上生产环境做真实…...

LabVIEW采光节能控制系统

​以自然光采集与室内智能调光工程为载体&#xff0c;基于 LabVIEW 图形化编程平台搭建完整测控系统&#xff0c;整合图像采集、照度标定、无线通信、PID 调节、嵌入式部署等技术。依托 LabVIEW 快速开发、多硬件兼容、算法集成、数据可视化等原生能力&#xff0c;完成室内自然…...

QMcDump终极指南:快速解锁QQ音乐加密文件的完整教程

QMcDump终极指南&#xff1a;快速解锁QQ音乐加密文件的完整教程 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾…...

机器学习揭示h-BN莫尔超晶格中滑动铁电的拓扑极化图案与调控

1. 项目概述&#xff1a;当机器学习遇见莫尔物理最近几年&#xff0c;但凡关注凝聚态物理前沿的人&#xff0c;都绕不开“莫尔超晶格”这个词。简单来说&#xff0c;就是把两层原子晶体&#xff08;比如石墨烯、过渡金属硫化物&#xff09;稍微扭一个角度&#xff0c;或者让它们…...

Godot中文离线文档本地构建全指南

1. 为什么你下载的“Godot中文文档”总在关键时刻打不开&#xff1f;我第一次在客户现场调试一个嵌入式Godot游戏时&#xff0c;笔记本突然断网——不是Wi-Fi掉线&#xff0c;是整个厂区网络策略限制&#xff0c;所有外网HTTP/HTTPS请求被拦截。当时我正卡在一个Node2D.set_glo…...

基于SVD/HOSVD与DLinear的流体场高分辨率预测模型解析

1. 项目概述&#xff1a;当流体动力学遇上智能预测在计算流体动力学&#xff08;CFD&#xff09;和科学机器学习&#xff08;SciML&#xff09;的交叉领域&#xff0c;我们每天都在和数据洪流搏斗。一次高保真度的湍流模拟&#xff0c;动辄产生TB级的高维时空数据——速度场、压…...

PCA降维技术解析椭圆曲线Tate-Shafarevich群的数据模式

1. 项目概述&#xff1a;当数论遇到机器学习 作为一名长期在数论和计算数学交叉领域摸索的研究者&#xff0c;我常常思考一个问题&#xff1a;那些深奥的代数几何对象&#xff0c;比如椭圆曲线的Tate-Shafarevich群&#xff0c;其复杂的行为能否被现代的数据科学工具所“看见”…...