首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shmop_open关键参数是什么?

shmop_open关键参数是什么?
EN

Stack Overflow用户
提问于 2015-10-18 12:31:22
回答 1查看 1.3K关注 0票数 3

从PHP,它说

int shmop_open ( int $key,string $flags,int $mode,int $size )

其中,$key是

共享内存块的系统id。可以以十进制或十六进制的形式传递。

有些人使用任意数字(1)填充$key,而另一些人则使用文件来获取$key值(2)。$key是一个随机值吗?

(1)

代码语言:javascript
复制
   $shm_id = shmop_open(987654, "c", 0644, 100);

(2)

代码语言:javascript
复制
   $shm_key = ftok(__FILE__, 't');
   $shm_id = shmop_open($shm_key, "c", 0644, 100);

顺便说一句,在windows中,我使用了一个小的数字,当它工作时,我被限制使用1024字节。虽然使用一个大的数字作为密钥,我能够寻址更多的内存。为什么?。

EN

回答 1

Stack Overflow用户

发布于 2015-10-18 21:58:54

如果您查看shmop_open(),您将看到该函数基本上是POSIX shmget()shmctl()shmat()例程的包装器。您可以看到,$key参数作为System键传递给shmop_open()shmget()

shmget()返回与给定键关联的共享内存段的标识符。如果传递给shmget()的密钥是特殊值IPC_PRIVATE,那么这是指唯一的共享内存段,它只能由fork()创建的后代进程继承(请注意,这可能与您的情况无关)。否则,为了让两个进程访问相同的共享内存段,它们需要使用相同的键获取该段的标识符。

您可以使用固定键,如您引用的第一个示例。但是,使用固定键很容易发生意外冲突。

更好的方法是使用ftok()。如果您始终使用ftok()生成密钥,那么冲突的风险就会降低,因为ftok()保证生成的密钥在使用不同的id值调用时会有所不同,或者使用同时命名同一文件系统中存在的两个不同文件的路径。

请参阅How to choose the "Key" for inter-processes communication in Linux?

Windows上的PHP本机不支持共享内存函数。相反,它们通过“线程安全资源管理器”(TSRM)进行模拟。您可以在shmget()中找到TSRM/tsrm_win32.c。众所周知,TSRM共享内存仿真有点古怪(例如,请参阅this answer)。

我觉得奇怪的是,TSRM shmget()实现通过以下方法构造了一个表示共享内存段的Windows:

代码语言:javascript
复制
char shm_segment[26], shm_info[29];
/* ... */
snprintf(shm_segment, sizeof(shm_segment)-1, "TSRM_SHM_SEGMENT:%d", key);

因为"TSRM_SHM_SEGMENT:“的长度是17,这个对snprintf()的调用最多会写24个字符,所以这个键只剩下7个字符。因此,似乎只有-999999到9999999之间的键(包括-999999和9999999之间的键)才能在WindowsPHP中使用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33197947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档