通过socketpair()函数实现同一进程内部的进程间通信(IPC)

        在某些情况下,我们可能需要将不同的进程之间进行数据传输或通信,而这些进程又在同一台计算机上运行。使用套接字(socket)是一种常用的IPC机制。通过创建一对文件描述符,可以在同一进程内模拟两个不同的套接字,并通过这些套接字进行进程间的通信。

具体应用场景包括:

  • 进程间的双向通信:一些应用程序需要在不同的进程之间传递数据或传递控制信号。
  • 父子进程之间的通信:在某些情况下,父进程需要与其派生的子进程进行通信。
  • 线程间的通信:在多线程环境下,不同的线程可能需要进行通信,而套接字提供了一种可靠的通信机制。

        通过使用文件描述符,可以方便地在同一进程内部进行通信,而不需要借助额外的进程间通信机制(如共享内存、消息队列等)来实现进程之间的信息交换。这样一来,实现进程间通信的编程代码可以更加简洁和易于维护。

        在C++中,socketpair()函数是一个用来创建一对相互连接的套接字的函数。该函数在Linux系统中可用。        

下面是socketpair()函数的函数原型和用法示例:

#include <sys/socket.h>int socketpair(int domain, int type, int protocol, int sv[2]);
  • domain  表示要使用的协议族,通常为AF_UNIX
  • type       指定套接字类型。常用的类型有SOCK_STREAMSOCK_DGRAM
  • protocol 指定所使用的协议。通常为0,表示使用默认协议。
  • sv          是一个套接字对的文件描述符数组,用来存储创建后的套接字。

下面是一个socketpair()函数的示例用法:

#include <iostream>
#include <unistd.h>
#include <sys/socket.h>int main() {int sv[2];if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {std::cerr << "Failed to create socket pair\n";return 1;}std::cout << "Socket pair created successfully\n";// 使用sv[0]和sv[1]进行读写操作close(sv[0]);close(sv[1]);return 0;
}

        在上面的示例中,我们使用socketpair()函数创建了一对流式套接字,存储在sv数组中。然后我们可以使用sv[0]和sv[1]进行读写操作。最后,记得关闭套接字。

下面是通过使用socketpair()实现父子进程之间的进程通信示例代码:

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>int main() {int sv[2];if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {std::cerr << "Failed to create socket pair\n";return 1;}pid_t pid = fork();if (pid == -1) {std::cerr << "Failed to fork\n";return 1;} else if (pid == 0) { // 子进程close(sv[1]); // 子进程关闭写描述符char buf[100];ssize_t bytesRead = read(sv[0], buf, sizeof(buf));if (bytesRead == -1) {std::cerr << "Failed to read from socket\n";return 1;}std::cout << "Child process received: " << buf << std::endl;close(sv[0]); // 关闭读描述符} else { // 父进程close(sv[0]); // 父进程关闭读描述符std::string message = "Hello from parent";ssize_t bytesSent = write(sv[1], message.c_str(), message.size());if (bytesSent == -1) {std::cerr << "Failed to write to socket\n";return 1;}close(sv[1]); // 关闭写描述符}return 0;
}

        在上面的示例中,我们通过socketpair()函数创建了一对相关的套接字(sv[2]),然后使用fork()函数创建了一个子进程。在子进程中,我们关闭了写描述符(sv[1]),并从读描述符(sv[0])读取数据。在父进程中,我们关闭了读描述符(sv[0]),并从写描述符(sv[1])向子进程发送数据。通过这种方式,我们在同一进程内部进行了进程间通信,实现了数据的交换。

注:

fork() 是一个系统调用,用于创建一个新的进程。在这个调用完成之后,会有两个进程同时运行,一个是父进程,一个是新创建的子进程。这两个进程具有相同的代码和状态,包括指令、变量值等。

在 fork() 调用之后,pid 变量的值可以用来区分父进程和子进程。如果 pid 的值为 0,则说明当前进程是子进程。如果 pid 的值大于 0,则说明当前进程是父进程,并且 pid 的值表示子进程的进程 ID。如果 fork() 调用失败,则 pid 的值为 -1。

在示例代码中,通过 fork() 创建了一个子进程。父进程和子进程会在 if 语句之后执行不同的代码,从而实现了进程的分离和分别执行不同的逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

52、Qt/窗口、常用类、ui相关学习20240321

一、使用Qt 自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c;通过代码实现 3. 需要添加适当的动图。 代码&#xff1a; #include "widget.h" #incl…

@Bean和@Component相似与区别

在Spring框架中&#xff0c;Bean和Component都是重要的注解&#xff0c;但它们之间存在一些明显的区别。 首先&#xff0c;它们的用途不同。Component是一个泛化的概念&#xff0c;用于标识一个普通的类&#xff0c;并将其声明为Spring组件。Spring可以扫描到配置了这个注解的…

两台不同账号同一区域阿里云服务器如何实现内网互通?

登录阿里云平台 [开通peer对等] 点击右上角的控制台&#xff0c;然后进行搜索专有网络VPC。 点击进入专有网络VPC界面操作步骤如下&#xff1a; &#xff08;1&#xff09;点击VPC对等连接&#xff0c;然后开通VPC对等连接后创建对等连接。 &#xff08;2&#xff09;在另…

霍夫变换找直线python代码以及从极坐标到笛卡尔坐标的转换

图像霍夫变换找直线 霍夫变换&#xff08;Hough Transform&#xff09;是图像分析中用于检测几何形状&#xff08;如直线、圆等&#xff09;的方法。最常用的是直线检测的霍夫变换&#xff0c;它可以从霍夫空间&#xff08;参数空间&#xff09;到笛卡尔空间&#xff08;图像空…

【计算机】——51单片机——持续更新

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路&#xff08;IC芯片&#xff09; 单片机是单片微型计算机&#xff08;Single Chip Microcomputer&#xff09;的简称&#xff0c;用于控制领域&#xff0c;所以又称为微型控制器&#xff08;Microcontroller U…

【java基础】Java 的主要特性

Java语言是简单的 ● Java语言的语法与C语言和C语言很接近&#xff0c;使得大多数程序员很容易学习和使用。另一方面&#xff0c;Java丢弃了C中很少使用的、很难理解的、令人迷惑的那些特性&#xff0c;如操作符重载、多继承、自动的强制类型转换。特别地&#xff0c;Java语言不…

038—pandas 重采样线性插补

前言 在数据处理时&#xff0c;由于采集数据量有限&#xff0c;或者采集数据粒度过小&#xff0c;经常需要对数据重采样。在本例中&#xff0c;我们将实现一个类型超分辨率的操作。 思路&#xff1a; 首先将原始数据长度扩展为 3 倍&#xff0c;可以使用 loc[] 方法对索引扩…

OpenCV4.9.0开源计算机视觉库安装教程

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 引言&#xff1a;OpenCV系列文章中的安装部分今天全部完成了&#xff0c;为了读者更方便阅读&#xff0c;大家可以按下列索引前往&#xff0c;成文较为仓促有错漏在所难免&#xff0c;欢迎大家指正…

【C#】使用C#窗体应用开启/停止Apache、MySQL服务

目录 一、前言 二、效果图 三、配置文件 四、代码 五、一键启动/停止所有服务 一、前言 使用C#窗体应用开启Apache、MySQL服务&#xff0c;不仅仅是Apache、MySQL&#xff0c;其他服务也可以使用同样的方法操作&#xff0c;包括开启自己写的脚本服务。 二、效果图 两种状…

JavaSE—IO流之字符流

&#x1f4cc; 字符流中的常用类及基本方法&#xff1a; 输入字符流 Reader输出字符流 Writer ○ Reader 的基本方法&#xff1a; • 读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾。 int read() throws IOException • 读取一系列字符并存储到一个数组buff…

BufferedInputStream解读

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java之IO流啦&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好习惯&am…

安卓Java面试题 206- 210

206. 简述如何统计Activity的工作时间 ?如何统计Activity启动所用的时间? 可以通过分析Log得到(这个就是DDMS的那个Log)。 当我们点击触摸时会了类似以下的Log A: 03-06 03:36:47.865: VERBOSE/InputDevice(2486): ID[0]=0(0) Dn (0=>1) 03-06 03:36:47.865: INFO/Powe…

继承和多态(2)(多态部分)

提前讲的重要知识点 一个类在没有父类的情况下默认有一个父类为Object类。 而当在有父类情况下&#xff0c;如果你那父类没有父类&#xff0c;则其父类的父类默认为object类&#xff0c;所以即使一个类有父类&#xff0c;其内部还是有object类。 object类都是隐藏起来的&…

[蓝桥杯 2023 省 A] 填空问题--幸运数

[蓝桥杯 2023 省 A] 填空问题 题目描述 A. 幸运数 小蓝认为如果一个数含有偶数个数位&#xff0c;并且前面一半的数位之和等于后面一半的数位之和&#xff0c;则这个数是他的幸运数字。例如 2314 2314 2314 是一个幸运数字&#xff0c;因为它有 4 4 4 个数位&#xff0c;并…

LangGraph 入门与实战

原文&#xff1a;LangGraph 入门与实战 - 知乎 大家好&#xff0c;我是雨飞。LangGraph 是在 LangChain 基础上的一个库&#xff0c;是 LangChain 的 LangChain Expression Language &#xff08;LCEL&#xff09;的扩展。能够利用有向无环图的方式&#xff0c;去协调多个LLM或…

【周总结】

周总结 完成项目混合版时区改造 完成相关jira问题的修改 完成老版本APP数据保存接口的兼容&#xff0c;手动赋值时区 2024/03/24 天气阴 一点不冷 1.Its time to go、Spring is coming&#xff01; 2. Its a nice day that staying with friends in a peaceful …

CentOS DHCP服务器部署指南

title: DHCP 服务器部署以及配置 search: 2024-03-21 tags: “#DHCP 服务器部署以及配置” CentOS DHCP 服务器部署指南 背景 &#xff1a;因上了 Linux 的实验课程&#xff0c;在课程中&#xff0c;老师要求我们自己搭建 DHCP 服务器构建局域网&#xff0c;在构建的时候问题百…

2024年云服务器ECS价格表出炉——腾讯云

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

用Python做一个植物大战僵尸

植物大战僵尸是一个相对复杂的游戏&#xff0c;涉及到图形界面、动画、游戏逻辑等多个方面。用Python实现一个完整的植物大战僵尸游戏是一个大工程&#xff0c;但我们可以简化一些内容&#xff0c;做一个基础版本。 以下是一个简化版的植物大战僵尸游戏的Python实现思路&#…

成功案例|全基因组测序+GWAS联合分析揭示不同种族帕金森病的遗传同质性和异质性

发表期刊&#xff1a;npj Parkinson’s Disease 影响因子&#xff1a;8.7 测序方式&#xff1a;WGS 研究对象&#xff1a;人 1 研究背景 帕金森病&#xff08;PD&#xff09;是一种常见的与年龄相关的神经退行性疾病&#xff0c;其特征是运动迟缓、姿势不稳定、僵硬和静息…