如何正确使用shmget&用于IPC共享内存的shmat用例

时间:2018-02-15 01:24:39

标签: c memory ipc shared

我尝试了解以下代码的行为

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线的输出会改变。

关于如何做shmget& amp; shmat工作?

1 个答案:

答案 0 :(得分:0)

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