Linux共享内存常见问题分析

本文详细分析了Linux System V共享内存中的常见问题,包括shmget创建内存大小限制、ftok生成key的注意事项、同一进程多次调用shmat的处理方式以及共享内存的删除策略。通过实际操作和经验分享,帮助读者理解并解决在使用Linux共享内存时可能遇到的挑战。
摘要由CSDN通过智能技术生成

前言

这个是接上篇,本来是记录在一篇草稿上的,但是,内容根本不相关,排版怎么都觉得不好看,也不方便以后查阅。干脆再起一篇。


System V 共享内存问题


shmget创建共享内存问题

shmget函数用来创建一个新的,或者访问一个已存在的共享内存区。
#include <sys/types.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int oflag);
返回值为整型的共享内存区标识符,用其指代刚创建或已存在的共享内存区。
key是ftok()返回的键值,size指定内存区大小,oflag是一些列读写权限组合。具体不做介绍,请参考《网络编程卷二》。

现在的问题是, 如果两个进程以一个相同的key共享一块内存区,但不同的进程调用shmget的size不一样,是否能成功?
  • 已经创建的共享内存的大小是可以调整的,但是已经创建的共享内存的大小只能调小,不能调大。也就是说,如果进程A先调用shmget创建一块size大小为10M的内存,进程B再次调用shmget时的size参数只能比10M小,如果大于10M,程序会报shmget error: Invalid argument错误。
这种关系可能导致的问题:
当多个进程都能创建共享内存的时候,如果key出现相同的情况,并且一个进程需要创建的共享内存的大小要比另外一个进程要创建的共享内存小,共享内存大的进程先创建共享内存,共享内存小的进程后创建共享内存,小共享内存的进程就会获取到大的共享内存进程的共享内存,并修改其共享内存的大小和内容,从而可能导致大的共享内存进程崩溃。

解决方法:
  1. 在oflag参数中使用排他性创建,即使用IPC_EXCL标记;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值