进程间通信方式

1>内核提供的原始通信方式有三种

1)无名管道

2)有名管道

3)信号

2>System V提供了三种通信方式

4)消息队列

5)共享内存

6)信号量(信号灯集)

3>套接字通信

7)socket

1)无名管道

1> 无名管道,就是没有名字的管道,是一个特殊的文件,并且存储在内存上,不在文件系统中展示

2> 无名管道打开后,会返回两个文件描述符,分别是读端和写端,当一个无名管道文件的两端全部被关闭后,管道文件在内存上消失

3> 由于无名管道在文件系统中没有真实的名字存在,所以不能使用open函数来打开,需要使用特殊的api进行打开

4> 无名管道只能适用于亲缘进程间的通信,需要在fork之前将管道文件打开,创建子进程后,子进程继承一份管道的文件描述符才能使用该管道

5> 无名管道的api

int pipe(int pipefd[2]);

2)有名管道

1> 有名管道,有名字的管道文件,会在文件系统创建一个管道文件,类型为 p

2> 该管道文件,仅仅只是用来进行进程间通信,不用于存储数据

3> 对管道文件的操作,可以使用open函数进行打开,所以,有名管道既可以用于亲缘进程间通信,也可以用于非亲缘进程间通信

4> 有名管道的api

int mkfifo(const char *pathname, mode_t mode);

3)信号

1> 信号是软件模拟底层硬件的中断操作,中断:打断当前正在进行的事情,去做另一件事

2> 信号是软件实现的,中断是硬件实现的

3> 信号是linux内核实现的,没有linux,就没有信号的概念

4> 用户可以给某个进程发送信号,一个进程也能给另一个进程发送信号,内核也可以给某个进程发送信号

5> 当一个进程收到信号后的操作有三种:默认(一般是杀死进程)、捕获、忽略

6>API

typedef void (*sighandler_t)(int);         //自定义函数类型sighandler_t signal(int signum, sighandler_t handler);

 4)消息队列

消息队列API(ftok、msgget、msgsnd、msgrcv、msgctl)

key_t ftok(const char *pathname, int proj_id);                //ftok("/", 'k');
功能:通过给定的数据,创建出一个用于IPC通信的key值int msgget(key_t key, int msgflg);
功能:通过给定的key值,以及消息队列的标识,创建一个消息队列int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:向消息队列中存放数据ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
功能:从消息队列中去一个消息int msgctl(int msqid, int cmd, struct msqid_ds *buf);
功能:控制消息队列相关属性

5)共享内存

共享内存的操作不是一次性的,当共享内存段中的数据被读取后,依然存在,共享内存是所有进程间通信方式中效率最高的,原因是,操作共享内存段时,无需进行用户空间和内核空间的切换

共享内存的API(shmget、shmat、shmdt、shmctl)

int shmget(key_t key, size_t size, int shmflg);
功能:获取共享内存段的ID void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:映射共享内存到用户空间 int shmdt(const void *shmaddr);
功能:撤销映射int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:操作共享内存

6)信号量(信号灯集)

信号量是完成多个进程之间同步问题的

信号灯集的API(semget、semctl、semop)

int semget(key_t key, int nsems, int semflg);
功能:创建信号灯集,并返回该信号灯集的idint semctl(int semid, int semnum, int cmd, ...);
功能:初始化信号灯集中信号灯的值或者删除信号灯集int semop(int semid, struct sembuf *sops, unsigned nsops);
功能:完成PV操作 

7)socket

socket(网络通信中信息的载体)

1> socket最原始时期也是用来完成同一主机之间的两个进程间的通信,随着TCP/IP协议族的引入,也能完成跨主机之间进程的通信

2> socket本质上是一个套接字文件,操作该文件时,使用的是文件io操作,实际操作的还是文件描述符

3> socket也是一个函数,用于创建一个套接字

既可以创建TCP通信的套接字,也适用于创建UDP通信的套接字

4> socket是系统给我们提供的函数,他会将复杂的网络通信过程转换成我们熟悉的IO操作,TCP/IP协议已经被集成到操作系统的内核中,

使用socket进行通信,相当于一种新型的IO操作

5> 通过传参的形式,来指定想要使用的协议

具体实现,会根据我们传入的参数的不同来完成

对于该文件操作方式:打开文件 --> 读写文件 --> 关闭文件

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

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

相关文章

代码对齐自动缩进排版代码格式化美化代码快捷键ShortcutKeyHotKey

代码对齐自动缩进排版代码格式化美化代码默认快捷键 Eclipse : Ctrl Shift F Ctrl Shift F Ctrl Shift F VsCode : Shift Alt F Shift Alt F Shift Alt F Idea : Ctrl Alt L Ctrl Alt L Ctrl Alt L Visual Studio : Ctrl K F Ctrl K F Ctrl K …

TCP/IP LWIP FPGA 笔记

参考资料: 正点原子 LwIP 之 网络接口 netif(ethernetif.c、netif.c)-CSDN博客 IPv4/IPv6、DHCP、网关、路由_ipv6有网关的概念吗-CSDN博客 TCP/IP TCP/IP 协议中文名为传输控制协议/因特网互联协议,又名网络通讯协议&#xf…

MySQL 安装配置 windows

一、下载 去官网MySQL :: MySQL Downloads 下载社区版 然后根据自己的系统选择 直接下载。 二、安装 点击安装程序 这边看样子缺少东西。 去这边下载 Latest supported Visual C Redistributable downloads | Microsoft Learn 然后再一次安装mysql 三、配置 安装完成后&a…

C++重新入门-C++基本语法

目录 1.C程序结构 2.C 中的分号 & 语句块 3.C 标识符 4.C 关键字 5.C 中的空格 1.C程序结构 C程序结构通常包括以下几个主要部分: 注释(Comments): 注释是用来解释代码的文字,对于程序员而言是非常重要的。在…

记录关于node接收上传文件formData踩的坑

1.vue2使用插件formidable实现接收文件,首先接口不可以使用任何中间件,否则form.parse()方法不执行。 const express require(express) const multipart require(connect-multiparty); const testController require(../controller/testController)/…

WordPress SMTP发信避坑指南

前言 Clip_2024-01-31_19-46-18803285 10.5 KB 目前不少主题已经内置了SMTP发信功能,这是因为WordPress自带的mail()函数发信时基本无法发送。 但是在之前(约2021年末)貌似可以通过WordPress自带的函数发信,并且收信方提示由xxx代…

可以将linux docker容器中的文件拿出来吗?

当然可以。在Linux环境下,可以从Docker容器中将文件拿出来(即复制到宿主机上),或者将宿主机的文件复制到Docker容器中。以下是两种常用方法: 方法1:使用 docker cp 命令 直接从命令行拷贝文件或目录&…

MySQL数据库安全加固方案

数据库版本:MySQL8.0.22 按照本安全加固方案进行的数据库加固,一般安全扫描工具扫描出来几乎无漏洞。 1.2 帐号安全 1.2.1 避免不同用户间共享帐号 参考以下步骤。 A. 创建用户。 mysql>CREATE USER ‘用户名’@‘用户 host’ IDENTIFIED BY ‘密码’; 执行以上命令可以…

Request Response 基础篇

Request & Response 在之前的博客中,初最初见到Request和Response对象,是在Servlet的Service方法的参数中,之前隐性地介绍过Request的作用是获取请求数据。通过获取的数据来进行进一步的逻辑处理,然后通过对Response来进行数…

C# Onnx yolov8 水表读数检测

目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 水表读数检测 效果 模型信息 Model Properties ------------------------- date:2024-01-31T10:18:10.141465 author:Ultralytics task:detect license:AGPL-…

c语言---访问越界之后死循环的原因

目录 死循环的概念环境题目代码运行结果对代码发生情况进行解释对i的地址和arr[12]地址一样的解释注意总结 死循环的概念 简单来说,死循环就是指无法靠自身的控制终止循环,在编程中,则是靠自身控制无法终止的程序。即在某一时刻,…

uniapp基于Android平台的校园生活服务交流论坛系统(二手,失物招领 -跑腿) 小程序hbuiderx

作为一款APP的校园论坛系统,面向的是大多数学者,软件的界面设计简洁清晰,用户可轻松掌握使用技巧。在调查之后,获得用户以下需求: (1)用户注册登录后,可进入系统解锁更多功能&#x…

Python中的Statsmodels库实际案例解析1:市场营销效果分析

在现代商业环境中,了解和评估市场营销活动的效果对于企业来说至关重要。它不仅帮助企业优化广告支出,还能够提高市场策略的整体效率。本文将通过一个实际案例,展示如何使用Python中的Statsmodels库来进行市场营销效果的分析。 写在开头 市场营销效果分析对于评估和优化广告…

【从零开始的rust web开发之路 四】rust语言tokio异步使用redis教程

文章目录 前言一、首先引入依赖二、创建redis客户端三、相关操作设置值mset设置多个key值设置含有过期时间的值如果key不存在才设置获取基本类型值删除一个键删除多个键判断键是否存在 如何使用json序列化导入相关依赖代码相关实例 总结 前言 使用rust写web,自然是…

Windows网络常用的11个命令,ping、tracert、arp、ipconfig、netstat、telnet等

1.ping命令 ping是个使用频率极高的实用程序,主要用于确定网络的连通性。ping能够以毫秒为单位显示延迟。如果应答时间短,表示数据报不必通过太多的路由器或网络,连接速度比较快。ping还能显示TTL(Time To Live&#…

AspNet web api 和mvc 过滤器差异

最近在维护老项目。定义个拦截器记录接口日志。但是发现不生效 最后发现因为继承的 ApiController不是Controller 只能用 System.Web.Http下的拦截器生效。所以现在总结归纳一下 Web Api: System.Web.Http.Filters.ActionFilterAttribute 继承该类 Mvc: System.Web.Mvc.Ac…

客户端和服务端的简介

Client 和 Server 客户端(Client) 或称用户端,是指与服务器相对应,为客户提供本地服务的程序。除了一些只在本地运行的应用程序之外,一般安装在客户机上,需要与服务端互相配合运行。例如:下载 Q…

ChatGPT炸裂了

优质内容:ChatGPT太炸裂了 hello,我是小索奇 很多人在使用ChatGPT时遇到了两个主要问题,导致他们觉得这个工具并没有带来太多实际价值。首先,许多人发现ChatGPT的回答缺乏深度,缺乏实用性。其次,一些人在使…

MySQL操作问题汇总

MySQL操作问题汇总 无法远程连接Ubuntu的MySQL 无法远程连接Ubuntu的MySQL 提示:MySQL默认只允许本地连接:localhost 解决: #1.修改配置文件 #/etc/mysql/mysql.conf.d/mysqld.cnf > cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/…

WebSocketServer依赖注入问题

WebSocketServer加入spring的bean管理 问题 @Component @ServerEndpoint("/webSocket/{topic}") @Slf4j public class WebSocketServer {@Autowiredprivate WsHandle wsHandle;} 前面使用@ServerEndpoint注册一个websocket服务端,然后发现wsHandle依赖注入失败,…