当前位置: 首页 > news >正文

一个使用共享内存进行进程间通信的程序,主要功能是创建并读取共享内存中的数据。具体作用如下:

#include <stdio.h>                  // 包含标准输入输出库
#include <sys/ipc.h>                // 包含IPC(进程间通信)相关函数定义
#include <sys/shm.h>                // 包含共享内存相关函数定义
#include <sys/types.h>              // 包含基本系统数据类型定义
#include <string.h>                 // 补充字符串处理函数库(原代码使用了strncmp)int main()
{// 1、获取key值key_t key = ftok(".", 10);      // 生成唯一key值,当前目录和10作为参数// 2、根据key值获取共享内存的ID号int shmid = shmget(key, 1024, IPC_CREAT | 0666);  // 创建/获取共享内存,大小1024字节,权限0666// 3、将共享内存映射至本进程虚拟内存空间char *shm_p = shmat(shmid, NULL, 0);  // 映射共享内存到当前进程地址空间,返回映射地址// 检查映射是否成功if (shm_p == (void *)-1){perror("shmat error");        // 映射失败时输出错误信息return -1;                    // 映射失败,程序退出}// 循环读取共享内存数据while (1){// 从共享内存中读取数据并打印printf("recv: %s\n", shm_p);  // 打印共享内存中的数据sleep(1);                     // 休眠1秒,降低CPU占用// 检查退出条件(比较前4个字符是否为"exit")if (strncmp(shm_p, "exit", 4) == 0)break;                    // 如果是退出指令,则跳出循环}return 0;                        // 程序正常结束
}
  1. 创建共享内存

    • 通过ftok()生成一个唯一的 key 值,作为共享内存的标识
    • 使用shmget()创建或获取共享内存段,大小为 1024 字节
    • 通过shmat()将共享内存映射到当前进程的地址空间
  2. 读取共享内存数据

    • 进入无限循环,不断从共享内存中读取数据并打印
    • 每读取一次数据后休眠 1 秒,降低系统资源占用
  3. 退出机制

    • 当从共享内存中读取到以 "exit" 开头的数据时,退出循环并结束程序

这个程序通常需要配合另一个写入共享内存的程序使用,两个进程通过共享同一块内存区域实现数据交换,这是 Linux 系统中进程间通信 (IPC) 的一种常用方式。共享内存是效率最高的 IPC 方式,因为数据不需要在进程间复制,而是直接访问同一块内存区域。

http://www.dtcms.com/a/306627.html

相关文章:

  • 《Flutter篇第二章》MasonryGridView瀑布流列表
  • 机器视觉引导机器人修磨加工系统助力芯片封装
  • 机器人在动态表面上行走的强化学习研究
  • Rust在土木工程中的创新应用
  • Kotlin -> Kotlin Lambda 表达式与 Function 接口的关系
  • EC2 Amazon Linux 快速安装Airbyte (abctl)
  • B 站排名优化:不同领域的差异化实战策略
  • Ubuntu24.04换源方法
  • macOS安装配置Unbound DNS完整指南
  • 地质测绘专业转码容易吗?外业对于转码有帮助吗?
  • WordPress与主流CMS拿Webshell实战
  • NEG指令说明
  • 鸿蒙中相册权限弹窗
  • 单片机电路基础
  • Prompt编写规范指引
  • 一种高维数据可视化的方法:Visualization and Mapping on Arcs (VMA)
  • MySQL的单行函数:
  • uniapp中的$vm
  • Winform 渐变色 调色板
  • 【AI论文】单一领域能否助力其他领域?一项基于数据的、通过强化学习实现多领域推理的研究
  • C#程序员计算器
  • Linux性能分析与内存调试:perf和Valgrind高级使用指南
  • 数据结构(7)单链表算法题OVA
  • Tlias 案例-整体布局(前端)
  • docker镜像加速及国内镜像源
  • cocos打包web - ios设备息屏及前后台切换音频播放问题
  • 美国人工智能行动计划:洞察 AI 发展新路径​​
  • 怎样在 Vue 中定义全局方法?
  • 快速删除Word和WPS文字中的空白行
  • LLM—— 基于 MCP 协议(SSE 模式)的工具调用实践