IPC之System V vs POSIX

文章目录

  • IPC
  • 示例
    • 共享内存
      • POSIX shm
      • System V shm

IPC

当谈到IPC(Inter-Process Communication,进程间通信)时,它是指不同进程之间进行数据交换和通信的机制。
它允许在操作系统中运行的不同进程之间传输数据,这些进程可以是在同一台计算机上运行的不同应用程序,也
可以是在不同计算机上运行的不同应用程序。

IPC有多种实现方式,包括管道、消息队列、共享内存、信号量、套接字等。每种方式都有自己的特点和适用场景。

Linux 提供有SystemV 和 POSIX 两种接口:
SYSTEM V的接口使用时间比较久,应用广泛,很多旧的产品功能采用;
POSIX的接口设计较好,学习使用都比较容易。

个人觉得如果是新的代码还是采用POSIX接口比较好。

system V 的IPC (消息队列、信号量、共享内存)
https://man7.org/linux/man-pages/man7/sysvipc.7.html

POSIX IPC 的是各种IPC分开说明的
https://man7.org/linux/man-pages/man7/mq_overview.7.html 消息队列
https://man7.org/linux/man-pages/man7/sem_overview.7.html 信号量
https://man7.org/linux/man-pages/man7/shm_overview.7.html 共享内存

看以上的文档基本上就够了。

附上POSIX的标准
https://pubs.opengroup.org/onlinepubs/9699919799/

示例

共享内存

通过以下示例,可以了解一下POSIX与SystemV 的接口区别。

POSIX shm

// 一个主进程,负责往共享内存中写数据
#include <sys/mman.h>
#include <sys/stat.h>        /* For mode constants */
#include <fcntl.h>           /* For O_* constants */
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>int main(int argc, char **argv)
{int ret;int fd;char *m;int *t;fd = shm_open("/somename", O_CREAT | O_RDWR, DEFFILEMODE);  /* 这里有特别注意mode的取值,如果是0 的话,则可能导致其他进程无权限获取共享内存 */if (fd < 0) {printf("shm open fail. %s\n", strerror(errno));return -1;}if (ftruncate(fd, 4) < 0) {printf("ftruncate fail.\n");goto error;}m = mmap(NULL, 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (m == MAP_FAILED) {printf("mmap error");goto error;}t = (int *)m;*t = 0;while (1) {(*t)++;sleep(1);}munmap(m, 4);error:close(fd);shm_unlink("/somename");return 0;
}
// 另一个进程,读取共享内存的数据
#include <sys/mman.h>
#include <sys/stat.h>        /* For mode constants */
#include <fcntl.h>           /* For O_* constants */
#include <unistd.h>
#include <stdio.h>int main(int argc, char **argv)
{int ret;int fd;char *m;int *t;fd = shm_open("/somename", O_RDWR, 0);if (fd < 0) {printf("shm open fail.\n");return -1;}m = mmap(NULL, 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (m == MAP_FAILED) {printf("mmap error");goto error;}t = (int *)m;while (1) {printf("read %d\n", *t);sleep(2);}munmap(m, 4);error:close(fd);shm_unlink("/somename");return 0;
}

System V shm

// 进程1 写入共享内存数据
#include <sys/mman.h>
#include <sys/stat.h>        /* For mode constants */
#include <fcntl.h>           /* For O_* constants */
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>#include <sys/ipc.h>
#include <sys/shm.h>int main(int argc, char **argv)
{int shmid;key_t key = 0x1234;char *addr;int *val;shmid = shmget(key, 4, IPC_CREAT | DEFFILEMODE);if (shmid < 0) {printf("shmget fail\n");return -1;}printf("get id %d\n", shmid);addr = shmat(shmid, NULL, 0);if (addr == (void *)-1) {printf("shmat fail. %s\n", strerror(errno));goto error;}val = (int *)addr;*val = 0;while (1) {(*val)++;sleep(1);}error:shmctl(shmid, IPC_RMID, NULL);return -1;
}
// 读取共享内存数据
#include <sys/mman.h>
#include <sys/stat.h>        /* For mode constants */
#include <fcntl.h>           /* For O_* constants */
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>#include <sys/ipc.h>
#include <sys/shm.h>int main(int argc, char **argv)
{int shmid;key_t key = 0x1234;     /* 还可以用ftok 来生成一个与文件有关的key值,这里写死简化逻辑 */char *addr;int *val;shmid = shmget(key, 4, 0);if (shmid < 0) {printf("shmget fail\n");return -1;}printf("read id %d\n", shmid);addr = shmat(shmid, NULL, 0);if (addr == (void *)-1) {printf("shmat fail.\n");goto error;}val = (int *)addr;while (1) {printf("read %d\n", *val);sleep(2);}error:shmctl(shmid, IPC_RMID, NULL);return -1;
}

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

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

相关文章

Shell 编程:探索 Shell 的基本概念与用法

目录 Shell 简介 Shell 脚本 Shell 脚本运行 Shell 变量 1、创建变量和赋值 2、引用变量 3、修改变量的值 4、只读变量 5、删除变量 6、环境变量 Shell 字符串操作 1、拼接字符串 2、字符串长度 3、字符串截取 Shell 数组 1、创建数组 2、访问数组元素 shell …

数组分割(2023省蓝桥杯)n种讨论 JAVA

目录 1、题目描述&#xff1a;2、前言&#xff1a;3、动态规划&#xff08;bug)&#xff1a;3、递归 剪枝&#xff08;超时&#xff09;&#xff1a;4、数学&#xff08;正解&#xff09;&#xff1a; 1、题目描述&#xff1a; 小蓝有一个长度为 N 的数组 A [A0, A1,…, AN−…

【⑭MySQL | 数据类型(二)】字符串 | 二进制类型

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL字符串 | 二进制类型类型的分享✨ 目录 前言5 字符串类型6 二进制类型总结 5 字符串类型 字符串类型用来存储字符串数据&#xff0c;还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比…

.net6.0引用的dll放置单独的文件夹

.net6.0 采用原有的设置方法不起作用 <?xml version"1.0" encoding"utf-8" ?> <configuration><startup> <supportedRuntime version"v4.0" sku".NETFramework,Versionv4.8" /></startup><runtim…

PDF如何转ppt?PDF转ppt的方法

PDF是一种广泛应用于文档传输和存储的格式&#xff0c;然而&#xff0c;在某些情况下&#xff0c;我们可能需要将PDF文件转换为PPT&#xff0c;以便更加灵活地编辑和展示内容。那么&#xff0c;PDF如何转ppt呢?在本文中&#xff0c;我们将介绍几种常用的方法和工具&#xff0c…

总结:Git 撤销操作

1、还未添加到暂存区&#xff1a;git checkout -- filename 执行命令后&#xff0c;会回退到未修改之前的状态 2、已经添加到暂存区&#xff1a;git reset HEAD filename 执行命令后&#xff0c;会回退到工作区之前的状态 3、已经 commit&#xff0c;但是还未 push git reset…

ImageReader保存图片转 opencvmat

目录 ImageReader 直接保存图片&#xff0c;没成功&#xff0c;格式是yuv420&#xff0c;需要转换 转opencv nv21保存图片&#xff0c;测试ok rgb888 data保存图片&#xff1a; ImageReader 直接保存图片&#xff0c;没成功&#xff0c;格式是yuv420&#xff0c;需要转换 …

VLOOKUP

VLOOKUP简单应用 VLOOKUP(A1,B:B,1,FALSE) 是查询A1这子格子的数据在B这一列里面有没有找到相同数据的值,如果有的话就放在当前格子里面去 如果没有的话就是#NA VLOOKUP(A1,F:G,2,FALSE) 是查询A1这子格子的数据在F列查相同的数据,然后再取G列这一行后面的这个格子的数据放到…

Python学习笔记_进阶篇(三)_django知识(二)

本章内容 Django model Model 基础配置 django默认支持sqlite&#xff0c;mysql, oracle,postgresql数据库。 <1> sqlite django默认使用sqlite的数据库&#xff0c;默认自带sqlite的数据库驱动 引擎名称&#xff1a;django.db.backends.sqlite3 <2>mysql …

【算法刷题之哈希表(2)】

目录 1.leetcode-454. 四数相加 II2.leetcode-383. 赎金信&#xff08;1&#xff09;暴力解法&#xff08;2&#xff09;哈希法 3.leetcode-205. 同构字符串&#xff08;1&#xff09;哈希法&#xff08;2&#xff09;直接对比查找 4.leetcode-128. 最长连续序列5.总结 1.leetc…

solidity0.8.0的应用案例14:空投合约

空投是币圈中一种营销策略,项目方将代币免费发放给特定用户群体。为了拿到空投资格,用户通常需要完成一些简单的任务,如测试产品、分享新闻、介绍朋友等。项目方通过空投可以获得种子用户,而用户可以获得一笔财富,两全其美。 因为每次接收空投的用户很多,项目方不可能一…

mysql-sql性能分析工具

一、sql执行频率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以提供服务器状态信息。通过如下指令&#xff0c;可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次&#xff1a; -- session 是查看当前会话 ; -- global 是查询全…

启动docker容器的几种方法和注意事项(docker-compose,dockerfile)

1&#xff1a;要启动容器必须都先创建好镜像文件 C:\Users\dell>docker images REPOSITORY TAG IMAGE ID CREATED SIZE poi 1.0 22738bb31074 4 hours ago 105MB redis latest 506734eb5e71 6 days ago 138MB ng…

【硕士论文完美复现】【价格型需求响应】基于需求侧响应的配电网供电能力综合评估(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

最新基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

七大排序算法详解

1.概念 1.排序的稳定性 常见的稳定的排序有三种&#xff1a;直接插入排序&#xff0c;冒泡排序&#xff0c;归并排序 对于一组数据元素排列&#xff0c;使用某种排序算法对它进行排序&#xff0c;若相同数据之间的前后位置排序后和未排序之前是相同的&#xff0c;我们就成这种…

机器学习之ResNet(残差网络)与常用的标准数据集

ResNet&#xff08;Residual Network&#xff09;是一种深度神经网络&#xff0c;由微软实验室的何凯明等几位大神在2015年提出&#xff0c;并在当年的ImageNet竞赛中获得了分类任务第一名。 ResNet通过引入残差结构&#xff08;residual structure&#xff09;&#xff0c;解决…

vue3 vite使用 monaco-editor 报错

报错&#xff1a;Unexpected usage at EditorSimpleWorker.loadForeignModule 修改配置&#xff1a; "monaco-editor-webpack-plugin": "^4.2.0",删除不用 版本&#xff1a; "monaco-editor": "^0.28.1", 修改如下&#xff1a; opti…

《基于 Vue 组件库 的 Webpack5 配置》2.模块规则 module.rule

配置 module.rules &#xff0c;创建模块时&#xff0c;匹配请求的规则数组&#xff1b; 可参考 webpack5 指南-管理资源&#xff1b; vue 可参考上述配置&#xff1b; js 使用 webpack babel-loader&#xff1b; css 参考 webpack 加载 CSS。注意style-loader 和 vue-style…

stm32 无刷电机 V/F控制(无刷电机变频控制)以及与foc(矢量控制)的区别

无刷电机有三种控制方式&#xff0c;方波控制&#xff0c;foc控制以及变频控制&#xff0c;前两章我们讲解了方波和foc的控制方法&#xff0c;今天我们一起来讲一讲什么是无刷电机的变频控制&#xff08;VF&#xff09;以及变频控制的优势是什么。 实验用的硬件还是KY_Motor的无…