我试着理解以下代码的行为

int memoryId = shmget(1234, 10240, IPC_CREAT | 0666);
client *client1 = shmat(memoryId, NULL, 0);
bool *game = shmat(memoryId, NULL, 0);
*game = true;
printf("1Game: %s\n",(*game)?"true":"false");
printf("2Game: %s\n",(*game)?"true":"false");
*client1 = (client){ 0, 0, 0, 0, 0, 0, 300, false};
printf("3Game: %s\n",(*game)?"true":"false");

输出如下:
1Game: true
2Game: true
3Game: false

我不明白为什么到3Game line时的输出会改变。
有什么关于shmget和shmat如何工作的建议吗?

最佳答案

shmget()
shmget()返回System V共享内存段的标识符
与参数键的值关联。
shmat()
shmat()将由shmid标识的共享内存段附加到
调用进程的地址空间。
基本上shmget创建一个共享内存缓冲区IPC_CREAT并返回它的ID。shmat将内存缓冲区附加到应用程序并返回指向它的指针。
因为gameclient1都对同一共享缓冲区使用shmat,所以腐蚀指针是相同的。
考虑到这一点:

*game = true;
*client1 = (client){ 0, 0, 0, 0, 0, 0, 300, false};

这两行都将值设置到内存中的同一位置-因此得到的结果与预期一致
http://man7.org/linux/man-pages/man2/shmget.2.html
https://linux.die.net/man/2/shmat

关于c - 如何为IPC共享内存用例正确使用shmget和shmat,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48798824/

10-11 22:05