首页 > 运维 > linux运维 > 正文

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

舞夢輝影
发布: 2025-11-26 14:26:48
原创
326人浏览过
共享内存通过直接访问同一物理内存实现高效IPC。示例中writer.c创建并写入数据,reader.c读取数据,需注意同步、键值生成、资源清理和权限设置。

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

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

1. 共享内存的基本流程

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

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

2. 写入进程(writer.c)

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

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

#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)

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

爱派AiPy
爱派AiPy

融合LLM与Python生态的开源AI智能体

爱派AiPy 1
查看详情 爱派AiPy
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>

#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方式。

以上就是Linux如何使用共享内存通信_LinuxIPC共享内存完整示例的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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