linux进程间通信(共享内存)

news2024/11/28 12:46:06

共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进 程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可 以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个 进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

Linux 操作系统的进程通常使用的是虚拟内存,虚拟内存空间是有由物理内存映射而来的。System V 共 享内存能够实现让两个或多个进程访问同一段物理内存空间,达到数据交互的效果。

 

 共享内存和其他进程间数据交互方式相比,有以下几个突出特点:

1. 速度快,因为共享内存不需要内核控制,所以没有系统调用。而且没有向内核拷贝数据的过程, 所以效率和前面几个相比是最快的,可以用来进行批量数据的传输,比如图片。

2. 没有同步机制,需要借助 Linux 提供其他工具来进行同步,通常使用信号量。

 使用共享内存的步骤:

1.调用 shmget()创建共享内存段 id,

2.调用 shmat()将 id 标识的共享内存段加到进程的虚拟地址空间,

3.访问加入到进程的那部分映射后地址空间,可用 IO 操作读写

常用 API

 

 

 

 

 

 实验代码:

在程序中,创建共享内存。

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
//int shmget(key_t key, size_t size, int shmflg);

int main(int argc, char const *argv[])
{
    int shmid;

    shmid = shmget(IPC_PRIVATE, 1024, 0777);  //用宏代替IPC_PRIVATE
    if (shmid < 0)
    {
        printf("get shmget failed\n");
        return -1;
    }
    printf("get share succeed %d\n",shmid);
    
    return 0;
}

编译运行程序如下图所示:

输入以下命令查看到创建的共享内存段的 id 和上面程序获取到的共享内存段的 id 是一样

 

 实验代码 在程序中,父子进程通过共享内存通信

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <stdlib.h>

// int shmget(key_t key, size_t size, int shmflg);  共享内存创建

int main(int argc, char const *argv[])
{
    int shmid;
    key_t key;
    pid_t pid;
    char *s_addr, *p_addr;

    key = ftok("./a.c", 'a');

    shmid = shmget(key, 1024, 0777 | IPC_CREAT); // 用宏代替IPC_PRIVATE
    if (shmid < 0)
    {
        printf("get shmget failed\n");
        return -1;
    }
    printf("get share succeed %d\n", shmid);

    pid = fork();
    if (pid > 0)
    {   
        // void *shmat(int shmid, const void *shmaddr, int shmflg); 地址映射
        p_addr = shmat(shmid, NULL, 0);
        strncpy(p_addr,"hello",5);
        wait(NULL);
        exit(0);
    }
    if (pid == 0)
    {
       sleep(2);
       s_addr = shmat(shmid,NULL,0);
       printf("s_addr is %s\n",s_addr);
       exit(0);
    }
    
    

    
    

    // int shmdt(const void *shmaddr);   解除共享映射区
    shmdt(p_addr);
    shmdt(s_addr); 
   //int shmctl(int shmid, int cmd, struct shmid_ds *buf);  删除共享内存
    shmctl(shmid,IPC_RMID,0);
    return 0;
}

 编译运行程序如下图所示:

优点:我们可以看到使用共享内存进行进程之间的通信是非常方便的,而且函数的接口也比较简单, 数据的共享还使进程间的数据不用传送,而是直接访问内存,加快了程序的效率。

缺点:共享内存没有提供同步机制,这使得我们在使用共享内存进行进程之间的通信时,往往需要借 助其他手段来保证进程之间的同步工作

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

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

相关文章

win10 编译 openssl

环境:系统win10 编译器:VS2015 准备: 一、openssl下载 官网&#xff1a;www.openssl.org 安装Perl,安装NASM. cmd下运行perl --version得出下面信息就说明安装perl安装成功. nasm --version得出下面信息,说明nasm安装成功 我以vs2015为例: 打开这个终端,之所以打开这个是因…

适合每一个对高光谱技术感兴趣,并想用python进行实践的人

总结了高光谱遥感技术领域的基础原理与核心概念&#xff0c;采用编程语言复现经典数据处理和应用方法&#xff0c;追踪了最新的技术突破&#xff0c;在消化理解、触类旁通之后&#xff0c;用即使是遥感“小白”也容易接受的方式分享给你。 高光谱遥感学习的第一季&#xff1a;提…

HTTP的缓存机制是什么?

HTTP 缓存机制是一种在 Web 开发中常用的技术&#xff0c;它旨在提高性能和减少网络流量。通过缓存&#xff0c;可以避免不必要的网络请求&#xff0c;减少服务器负载&#xff0c;并加快页面加载速度。下面是关于 HTTP 缓存机制的详细介绍。 HTTP 缓存机制的基本原理是将 Web …

LNMP网站框架搭建(yum方式)

目录 一、Nginx的yum安装 1&#xff09;搭建nginx相关的yum源 2&#xff09;刷新yum仓库&#xff0c;安装启动nginx服务 二、mysql的 yum 安装 1&#xff09;卸载一切与mysql有关的包 2&#xff09;wget mysql相关的yum源 附加&#xff1a;第二种方式&#xff08;与上…

单卡轻松打造 ChatGPT 竞争者“原驼”,QLoRA 革新大语言模型微调技术

出品人&#xff1a;Towhee 技术团队 作者&#xff1a;顾梦佳 由 OpenAI 推出的聊天机器人ChatGPT 爆火&#xff0c;带动 AI 受到了前所未有的关注。随之市面上也涌现出了各类开源的大语言模型&#xff08;LLM&#xff09;&#xff0c;其中 LLaMA “羊驼系列”最受关注、最具潜力…

Vue实现订单确认界面禁止浏览器返回操作导致重复提交订单的问题

哈喽 大家好啊 最近遇到一个问题&#xff0c;就是在提交订单成功后的页面&#xff0c;然后用户去浏览器返回&#xff0c;就导致又提交了一次 然后就想到了如果提交成功页面&#xff0c;就阻止浏览器返回操作 主要实现如下&#xff1a; 1.在mounted的钩子函数&#xff1a; 2.…

每日一练 | 华为认证真题练习Day50

1、SWA和SWB的MAC地址表中&#xff0c;MAC地址、VLAN、端口对应关系正确的有&#xff1f;&#xff08;多选&#xff09; 2、PPP帧格式中的Flag字段的取值为&#xff1f; A. 0xFF B. 0x7E C. 0xEF D. 0x8E 3、ICMP报文不包含端口号&#xff0c;所以无法使用NAPT。 A. 对 B…

[ Term ] 你真的了解 UTC 时间吗?它和 GMT 时间的区别是什么?

什么是 GMT 和 UTC&#xff0c;他们之间的区别是什么&#xff1f; GMT&#xff08;Greenwich Mean Time&#xff09;和UTC&#xff08;Coordinated Universal Time&#xff09;是两个不同的时间标准&#xff0c;但它们非常相似并且通常被混淆使用&#xff0c;那他们之间的区别在…

后端从入门到转岗,如何转型

一、技术介绍 我学习的技术很多&#xff1a; 例如&#xff1a;JAVA JS C# python vue mysql Oracle 等等。 学习也是从入门开始 &#xff0c;入口是JAVA 二、学习前的准备工作 学习前需要准备什么呢&#xff1f; 我觉得学习前最需要准备的是下定决心吃苦&#xff…

常见数据采集工具介绍

数据采集是指从各种数据源中收集数据并将其存储在一个地方&#xff0c;以便进行分析和处理。数据采集工具是帮助我们自动化数据采集过程的软件或服务。在本文中&#xff0c;我们将介绍一些常见的数据采集工具。 Web Scraper Web Scraper是一种免费的浏览器扩展&#xff0c;可…

低代码平台选型必看!让你少走弯路

目前低代码技术正处在风口&#xff0c;低代码平台产品不断涌现&#xff0c;乱花渐欲迷人眼。作为软件公司或企业IT部门的负责人&#xff0c;在做低代码平台的 选型时需要关注哪些方面&#xff0c;才能顺利“上车”&#xff0c;让低代码为自己的团队赋能&#xff1f; 除了产品功…

我的创作纪念日一周年

今天六一 祝大家节日快乐 &#xff01; 文章目录 机缘收获日常成就憧憬 机缘 其实好兄弟早在21年10月就已经注册了csdn账号&#xff0c;但是当初只是用来查找资料&#xff0c;也就是看别人写的博客吧&#xff0c;那时候感觉写博客好难&#xff0c;所以自己迟迟不敢尝试&#x…

如何将Linux命令默认的提示结果不显示或者不输出?以及在脚本中如何替代Ctrl + C等关闭命令的终端窗口?

一、问题描述&#xff1a; 当我们想要获取命令的输出结果时&#xff0c;有时候命令会带出一些默认的提示信息输出到屏幕上&#xff0c;如何过滤掉这个提示信息呢&#xff1f; 例如&#xff0c;telnet命令退出时会默认提示“Connection closed by foreign host.” 例如&#x…

如何使用一站式自动化测试平台TestOne进行App兼容性测试

首先&#xff0c;在讲主题之前&#xff0c;大家先了解移动兼容性测试包括哪些&#xff1f;然后再说&#xff0c;移动兼容性自动化测试方法有哪些&#xff1f;通过一站式自动化测试平台&#xff08;英文名称&#xff1a;TestOne&#xff09;&#xff0c;具体如何来实现&#xff…

RPG 类型游戏开发基础教程

RPG 游戏开发基础教程 第一步 下载 RPG Maker 开发工具包 1.RPG Maker 是什么&#xff1f; RPG Maker 是由 Enterbrain 公司推出的 RPG 制作工具。 中文译名为 RPG 制作大师。 熟悉的人喜欢简称为 RM。 2、关于 RPG Maker MV? RMMV 是当前 RM 系列最新发行的一款 RPG 制作工…

神奇的开关 — 可控硅

带大家认识下可控硅&#xff0c;以及可控硅的工作原理 ...... by 矜辰所致目录 前言一、什么是可控硅1.1 基本概念1.2 可控硅的结构1.2.1 单向可控硅1.2.2 双向可控硅 二、可控硅的工作原理2.1 可控硅是如何工作的导通条件维持条件关断条件 2.2 工作原理 三、可控硅的参数四、…

Idea+maven+springboot项目搭建系列--2 整合Netty完成客户端服务器端消息收发

前言&#xff1a;Netty 作为主流的nio 通信模型应用相当广泛&#xff0c;本文在spring-boot 项目中集成Netty&#xff0c;并实现客户端以及服务器端消息的接收和发送&#xff1b;本文是 Spring架构篇–2.7 远程通信基础–使用Netty 的扩展&#xff1b; 1 spring-boot jar包引入…

C++进阶 —— (C++11新特性)

三&#xff0c;范围for循环 四&#xff0c;final与override 五&#xff0c;智能指针 六&#xff0c;静态数组array、forward_list、unordered系列(新增容器) 七&#xff0c;默认成员函数的控制 在C中&#xff0c;对于空类编译器会生成一些默认成员函数(如构造函数、拷贝构造函数…

嵌入式Linux驱动开发 03:平台(platform)总线驱动模型

文章目录 目的基础说明开发准备在驱动中获取资源单驱动使用多个资源总结 目的 前面文章 《嵌入式Linux驱动开发 01&#xff1a;基础开发与使用》 和 《嵌入式Linux驱动开发 02&#xff1a;将驱动程序添加到内核中》 介绍了驱动开发最基础的内容&#xff0c;这篇文章将在前面基…

Vue3 小兔鲜4:Layout-静态模版结构搭建

Vue3 小兔鲜4&#xff1a;Layout-静态模版结构搭建 Date: May 31, 2023 目标效果&#xff1a; 分成Nav、Heade、二级路由出口、Footer区域 组件结构快速搭建 Nav <script setup></script><template><nav class"app-topnav"><div clas…