0

0

Linux如何使用共享内存通信_LinuxIPC共享内存完整示例

舞夢輝影

舞夢輝影

发布时间:2025-11-26 14:26:48

|

395人浏览过

|

来源于php中文网

原创

共享内存通过直接访问同一物理内存实现高效IPC。示例中writer.c创建并写入数据,reader.c读取数据,需注意同步、键值生成、资源清理和权限设置。

linux如何使用共享内存通信_linuxipc共享内存完整示例

共享内存是Linux进程间通信(IPC)中效率最高的一种方式,因为它允许两个或多个进程直接访问同一块物理内存区域,避免了数据在内核与用户空间之间的多次拷贝。下面通过一个完整的示例,展示如何使用System V共享内存实现两个进程间的通信。

1. 共享内存的基本流程

使用System V共享内存通信通常包括以下步骤:

  • 使用shmget()创建或获取一个共享内存段
  • 使用shmat()将共享内存段附加到当前进程的地址空间
  • 读写共享内存中的数据
  • 使用shmdt()分离共享内存
  • 使用shmctl()删除共享内存段(通常由一个进程负责清理)

2. 写入进程(writer.c)

该程序创建共享内存,写入数据,并等待读取完成。

#include 
#include 
#include 
#include 
#include 

#define SHM_SIZE 1024  // 共享内存大小

int main() {
    key_t key = ftok("shmfile", 65);  // 生成键值
    int shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT);  // 创建共享内存
    char *shmaddr = (char*)shmat(shmid, NULL, 0);  // 映射到进程地址空间

    printf("共享内存已创建,开始写入数据...\n");
    const char *msg = "Hello from writer process!";
    strcpy(shmaddr, msg);
    printf("数据已写入: %s\n", shmaddr);

    printf("等待读取进程完成...(按回车键继续)\n");
    getchar();

    // 分离并删除共享内存
    shmdt(shmaddr);
    shmctl(shmid, IPC_RMID, NULL);
    printf("共享内存已删除。\n");

    return 0;
}

3. 读取进程(reader.c)

该程序连接到已存在的共享内存,读取数据并分离。

OpenArt
OpenArt

在线AI绘画艺术图片生成器工具

下载
#include 
#include 
#include 
#include 

#define SHM_SIZE 1024

int main() {
    key_t key = ftok("shmfile", 65);
    int shmid = shmget(key, SHM_SIZE, 0666);  // 获取已有共享内存
    char *shmaddr = (char*)shmat(shmid, NULL, 0);

    printf("连接到共享内存,正在读取数据...\n");
    printf("接收到的数据: %s\n", shmaddr);

    // 分离共享内存
    shmdt(shmaddr);
    printf("已从共享内存分离。\n");

    return 0;
}

4. 编译与运行

将上面两个文件保存为writer.creader.c,然后编译:

gcc writer.c -o writer
gcc reader.c -o reader

运行顺序:

  1. 先运行写入进程:./writer,它会暂停等待输入
  2. 另开终端运行读取进程:./reader
  3. 回到第一个终端,按回车键让写入进程清理资源

5. 注意事项

  • 同步问题:共享内存本身不提供同步机制,实际应用中应配合信号量或互斥锁使用,防止竞态条件
  • 键值生成ftok()依赖文件路径和id,确保文件存在且权限正确
  • 资源清理:未删除的共享内存会驻留内核,可用ipcs -m查看,ipcrm -m [shmid]手动清除
  • 权限设置shmget()中的权限位如0666表示所有用户可读写
基本上就这些。共享内存适合大数据量、高频通信的场景,只要处理好同步和生命周期管理,是非常高效的IPC方式。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1349

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

702

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

572

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

545

2023.07.20

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

297

2023.07.20

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

380

2023.07.25

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号