【发布时间】:2011-02-23 11:18:59
【问题描述】:
我使用的是 Linux 2.6,但遇到了一个奇怪的问题。我有 3 个并发进程(从同一个进程派生)需要获取 3 个不同的共享内存段,每个进程一个。每个进程都执行这段代码(请注意'message'类型是用户定义的)
message *m;
int fd = shm_open("message", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(message));
m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
char messagename[16];
snprintf(messagename, sizeof(messagename), "%p", m);
char path[32] = "/dev/shm/";
strcat(path, messagename);
rename("/dev/shm/message", path);
让我解释一下:我希望每个进程分配一个包含消息的共享内存区域。为了确保另一个进程(消息接收者)可以访问同一个 shm,然后我将我的 shm 文件从“message”重命名为以消息指针命名的字符串(这是因为接收消息的进程已经知道指针)。
但是,在执行程序时,我尝试打印(出于调试目的)每个进程在映射使用 shm_open 获得的 fd 时收到的指针,我注意到它们都得到了相同的指针。这怎么可能?我认为也许其他进程在第一个进程之后和重命名段之前执行了 shm_open(),所以我也尝试通过使用进程共享互斥体使这些代码行成为原子操作,但问题仍然存在。
非常感谢任何形式的帮助或建议。
【问题讨论】:
标签: c linux ipc shared-memory interprocess