我尝试了解以下代码的行为
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工作?
答案 0 :(得分:0)
shmget的()
shmget()返回System V共享内存段的标识符 与参数键的值相关联。
的shmat()
shmat()将shmid标识的共享内存段附加到 调用进程的地址空间。
基本上shmget
创建共享内存缓冲区IPC_CREAT
并返回它的ID。 shmat
将内存缓冲区附加到应用程序并返回指向它的指针。
由于game
和client1
都使用shmat
到同一个共享缓冲区,因此相应的指针是相同的。
考虑到这一点:
*game = true;
*client1 = (client){ 0, 0, 0, 0, 0, 0, 300, false};
这两行将值设置为内存中的相同位置 - 因此您得到的结果与预期一致