进程间的通信3——IPC对象通信->共享内存、网络通信

2024-08-22 06:28

本文主要是介绍进程间的通信3——IPC对象通信->共享内存、网络通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、共享内存

1、原理

        直接对实际物理内存进行操作,不用先拷贝到用户空间再到内核空间(物理内存)。

2、特点

        (1)共享内存是一块内核预留的空间;

        (2)最高效的通信方式。

3、操作

        产生key值 ===>申请 ===>读写 ===> 关闭 ===> 卸载。

(1)产生key值

ftok

        key_t ftok(const char *pathname(路径名) , int proj_id(工程id))

功能:将pathname和proj_id转换为key值。

返回值:成功:key值;  失败:-1。

(2)通过key获取IPC对象

shmget

        int shmget(key_t key(key值) , size_t size(共享内存大小) , int shmflg(内存访问权限))

功能:使用唯一键值key向内核提出共享内存使用申请。

参数:shmflg通常为IPC_CREAT|0666用来申请 ; 若要检测为IPC_EXCL。

返回值:成功:有效id号;失败:-1。

注:ipcs命令用来查看共享内存。

(3)绑定地址空间

shmat

        void *shmat(int shmid(共享内存段id) , const void *shmaddir(绑定地址) , int shmflg(具体操作权限))

功能:将共享内存映射到本地内存。

参数:shmaddr为NULL(由系统选择合适地址);

        shmflg为SHM_RDONLY(只读)、0(读写)等。

返回值:成功:返回映射的地址(绑定地址);失败:(void *)-1。

pause

        int pause(void)   

等待一个信号。

(4)解除绑定(映射)

shmdt

        int shmdt(const void *shmddr)

(5)销毁IPC对象

shmctl

        int shmctl(int shmid , int cmd(删除对象宏) , struct shmid_ds *buf(删除对象))

功能:修改共享内存属性,可删除指定共享内存对象。

参数:cmd为IPC_RMID;

        buf为NULL。

例如:左边发送,右边接收。接收方需要等待一个信号通过pause来控制打印不会刷屏。实现发一个收一个的效果。

注意:(1)共享内存数据的存储方式是拷贝,而非剪切。

           (2)共享内存的数据多次不同进程读写同一操作对象,数据没有偏移情况下会覆盖

二、网络通信

1、前景介绍

网络通信需要在物理层面、软件(逻辑)层面都有通路。

局域网、城域网、广域网;因特网。

最初APAR Net //阿帕网便是将众多局域网连接,形成因特网雏形。

之后为解决不同体系结构网络互联问题,1981年国际标准化组织ISO制定了开放系统互连模型(OSI网络模型)。

2、OSI参考模型

(1)物理层:规定了物理层面的电气特性,及相关机械特性。

        完成物理层面数据的传输  —— 一位一位二进制数据。   //比特流

(2)数据链路层:规定了传输数据的格式。

        控制传输过程可靠 。    //帧数据

(3)网络层:用于解决网络与网络之间数据传输。     //数据包

(4)传输层:传输控制层,控制传输过程,保证数据完整性。  (TCP/UDP)

(5)会话层:处理一次会话过程。

(6)表示层:规定了传输数据的格式和方式。       //加密

(7)应用层:直接获取要收发的数据。

每个层次中,都有自己的一套规范——协议。

3、操作系统角度

应用层在用户层,其余都在内核层<网络协议栈>。用户层与内核层用socket接口来连接。

IP地址——用来标识网络中的一台主机(凡能网络通信的机器)。

端口号——用来标识主机中某一个具体(进行网络通信)进程

IP + 端口号——进程在网络的地址。

(1)IP

本质:32位(4进制)整型数值。<表示:点分十进制>

                一进制的范围:0~255。

组成:网络号(表示所处的网络) + 主机号(表示能容纳的主机)

分类:A类(0.x.x.x~127.x.x.x),B类(128.x.x.x~192.x.x.x),C类(192.x.x.x~223.x.x.x),D类(组播地址),E类(保留)

注:(1)主机号为0IP地址是网络地址,主机号为255的地址是广播地址。

       (2)子网掩码(255.255.255.0):与IP地址相与,结果判断是否在同一网络下。

(2)端口号

本质:16位数值(2字节)

分类:①众所周知端口:1~1023(1~255间为众所周知端口;256~1023端口通常由UNIX系统占用)

                                        知名端口号(已经分配给标准应用服务软件)。

                                eg:http协议用到端口号80.

        ②已登记端口:1024~49151

                                  注册端口号(非标准应用服务软件可申请)。

        ③动态或私有端口:49152~65535

                                  动态分配的端口号(系统动态分配给应用程序使用)。

                                 //    50000以上端口号

4、编程

        TCP/UDP:TCP协议<高可靠>特点——①面向连接   ②可靠传输(tcp协议机制里面的功能)。  //打电话

                           UDP协议<高效率>特点:①不可靠传输  ②无连接  ③数据报。   //广播

编程模型:①c/s(client server)——客户端-服务器模型;

                  ②b/s(browser server) ——浏览器-服务器模型。

(1)基于UDP c/s通信模型

-------client——客户端——主动角色-------

socket

        int socket(int domain(通信范围) , int type , int protocol)

功能:程序向内核提出创建一个基于内存的套接字描述符。

参数:domain:协议簇;当为AF_INET表示基于IPV4协议。

          type:SOCK_STREAM——流式套接字(通常指TCP);SOCK_DGRAM——数据报套接字(通常指UDP)。

           protocol:0默认。

         一种特殊的文件<专门用于网络通信>

        socket接口函数,提供了一个可访问操作系统网络功能的接口

sendto

        ssize_t sendto(int sockfd(用于通信的socket对应的fd) , const void *buf(发送数据所在空间) , size_t len(发送字节数) , int flags(0默认) , const struct sockaddr *dest_addr(目的地址) , socklen_t addrlen(目的地址长度))

        发数据。

返回值:成功:发送出去的字节数;失败:-1。

这篇关于进程间的通信3——IPC对象通信->共享内存、网络通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE