同一个父进程的多个子进程之间的通信

2024-06-22 19:48

本文主要是介绍同一个父进程的多个子进程之间的通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于父子进程之间的通信, 或者是没有亲缘关系的进程之间的通信, 之前都有过多多少少的了解, 就不作说明了.
这里想要讨论的是多个子进程之间的通信.
以前若是有多个子进程之间通信的需要, 那么我可能会选择使用共享内存? 使用消息队列? 或者使用一系列进程间通信机制
但这些同样适用于没有亲缘关系的进程之间的通信. 这样做似乎没有必要.

这里将要实现的子进程之间的通信, 使用了两个技术:
        一个是子进程继承父进程的描述符特性(这里是socketpair产生的管道描述符)
        一个是利用socketpair传递描述符特性.


大致步骤如下:
父进程调用sokcetpair, 产生一个管道, fork产生第一个子进程, 这样, 父子进程就能通过这个管道进行通信了
父进程再次调用socketpair, 之后fork出第二个子进程, 父进程与第二个子进程也能通过这个管道进行通信了
        第二个子进程同时继承了父进程与第一个子进程之间通信的管道, 说明此时第二个子进程能透过这个管道口向第一个子进程发送消息
        只是这是单向的. 第一个子进程却完全不了解第二个子进程的管道口, 甚至其是否存在都一无所知
        父进程 通过 其与第一个子进程之间的管道口 将 父进程与第二个子进程通信的管道口 传递给第一个子进程
        这时子进程记录下这个管道口, 就能向第二个子进程发送数据了
       (要注意的是, 描述符并不是一个单纯的数字, 其在内核中对应着一组信息, 所以传递描述符需要特殊的方法)
第三个子进程被fork出来, 同样, 它知道如何向第一和第二个子进程发送数据, 父进程则需要分别告诉第一和第二个子进程与第三个子进程通信的描述符
这样, 产生的多个子进程之间就能两两通信了.

要注意的是, 每个新fork出来的子进程都要关闭不使用的之前进程的另一个管道描述符.


下面就给出实现:
头文件:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>#ifndef CPC_H
#define CPC_H#define DEBUG
#define MAX_EVENT 64
//消息分两种, 一种是传递描述符; 一种在验证的时候我们会发送字符串验证
enum message_type{FD_TRANS = 0, MSG_TRANS};//做个规定, socketpair的数组, 0给父进程用. 1给子进程用
//所需的关于每个进程的结构体
typedef struct {pid_t pid;int index;int channel[2];
}process_t;typedef struct {enum message_type type;//消息是来自哪个进程的int sourceIndex;
}info_t;typedef struct{//传递描述符用这个int fd;//传递字符串用这个char str[64];
}content_t;typedef struct {info_t info;content_t data;
}message_t;//每个子进程主函数体
void child_run(int index, process_t *processes);
//消息读写函数
int write_channel_fd(int fd, message_t *data);
int recv_channel(int fd, message_t *data);
//添加事件到epoll中
void add_fd_to_epoll_in(int epollfd, int fd);#endif

这篇关于同一个父进程的多个子进程之间的通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085247

相关文章

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序