前言
这个是接上篇,本来是记录在一篇草稿上的,但是,内容根本不相关,排版怎么都觉得不好看,也不方便以后查阅。干脆再起一篇。
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不一样,是否能成功?
如果两个进程以一个相同的key共享一块内存区,但不同的进程调用shmget的size不一样,是否能成功?
-
已经创建的共享内存的大小是可以调整的,但是已经创建的共享内存的大小只能调小,不能调大。
也就是说,如果进程A先调用shmget创建一块size大小为10M的内存,进程B再次调用shmget时的size参数只能比10M小,如果大于10M,程序会报
shmget error: Invalid argument
错误。
这种关系可能导致的问题:
当多个进程都能创建共享内存的时候,如果key出现相同的情况,并且一个进程需要创建的共享内存的大小要比另外一个进程要创建的共享内存小,共享内存大的进程先创建共享内存,共享内存小的进程后创建共享内存,小共享内存的进程就会获取到大的共享内存进程的共享内存,并修改其共享内存的大小和内容,从而可能导致大的共享内存进程崩溃。
解决方法:
-
在oflag参数中使用排他性创建,即使用IPC_EXCL标记;
- <
版权声明:本文为fzy0201原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。