Unix 为什么这两个地址不一样?

Unix 为什么这两个地址不一样?,unix,shared-memory,Unix,Shared Memory,shmget.c: #include<sys/types.h> #include<string.h> #include<sys/ipc.h> #include<sys/shm.h> #include<stdio.h> main() { key_t key; int shmid; char* addr1; key = ftok("/home/tamil/myc/pws.c",'T'); shmid

shmget.c:

#include<sys/types.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
main()
{
    key_t key;
    int shmid;
    char* addr1;
    key = ftok("/home/tamil/myc/pws.c",'T');
    shmid = shmget(key,128*1024,IPC_CREAT|SHM_R|SHM_W);

    addr1 = shmat(shmid,0,0);

    printf("\nIPC SHARED MEMORY");
    printf("\n SENDER ADDRESS");
    printf("\nTHE ADDRESS IS %p",addr1);
    printf("\nENTER THE MESSAGE:");
    scanf("%s",addr1);
    printf("\nMESSAGE STORED IN %p IS %s",addr1,addr1);  
}

这一切都很好。但是地址不一样。这是为什么?

共享内存可以映射到不同进程地址空间中的不同区域。这是完全正常的。但是如果您在共享内存中存储指向共享内存其他部分的指针,那么您就有麻烦了。在这种情况下,您需要使用类似的地址。

您看到的地址不同,因为它们是虚拟的。每个进程都会得到一个“假装”的地址空间,该地址空间是连续的(没有间隙),并且可以随着时间的推移而变大。实际上,虚拟地址可以分块映射到RAM的不同部分。查看更多详细信息(特别是)。在共享内存的情况下,两个进程都可以看到一个RAM区域。然而,每个进程的地址看起来都不一样是完全正常的

我的想法是:

                      0x00   0x01             0x07               0xff         
 Process 2 Virtual:       +--+-----------------+------------------+
                             |                 |
 RAM Physical Addr:     0x04 +-----shared------+ 0x0a
                             |                 | 
 Process 1 Virtual:  +-------+-----------------+---------+
                    0x00    0x09              0x0f       0xff

(未按比例绘制:)请注意,进程1和进程2共享相同的RAM区域(物理地址0x04到0x0a),但共享的RAM被映射到其虚拟地址空间的不同部分(P1为0x09到0x0f;P2为0x01到0x07)

转化为严肃:在你所有的问题上,你都在高声叫喊,而不仅仅是这个问题。如果你有愤怒管理方面的问题,你可能想尽快解决。你在互联网上的声音越大,就有越多的人会忽略你。也许我不应该编辑这个问题来降低叫喊声,这样的评论很好。:)@clintp:如果你这么想的话,你可以把它滚回去:)@clintp:别担心,我会再补偿的@真的很抱歉。我从来都不是自愿的。也许我的英语不太好。我问问题的方式不好。但这不是我的性格。如果是这样的话,我肯定会改变我自己。请注意,上面说的是同一件事:“使用shmat()shmaddr等于NULL是附加共享内存段的首选可移植方式。请注意,以这种方式附加的共享内存段可能在不同进程的不同地址附加。因此,共享内存中维护的任何指针都必须是相对的(通常是段的起始地址),而不是绝对地址。“是的,我知道了,谢谢。但是如果我想要相同的物理地址,而不是这个不同的逻辑地址(为了让大学教授满意),有什么办法吗?@pooji:是的,我知道了,谢谢。但是如果我想要相同的物理地址,而不是这个不同的逻辑地址(为了让大学教授满意)有什么办法吗?
tamil@ubuntu:~/myc$ cc shmget.c
tamil@ubuntu:~/myc$ ./a.out

IPC SHARED MEMORY
 SENDER ADDRESS
**THE ADDRESS IS **0xb786c000****
ENTER THE MESSAGE:helloworld

MESSAGE STORED IN **0xb786c000** IS helloworldtamil@ubuntu:~/myc$ cc shmget2.c
tamil@ubuntu:~/myc$ ./a.out

IPC SHARED MEMORY
 SENDER ADDRESS
**THE ADDRESSS IS **0xb7706000****
MESSAGE STORED IN **0xb7706000** IS helloworldtamil@ubuntu:~/myc$ 
                      0x00   0x01             0x07               0xff         
 Process 2 Virtual:       +--+-----------------+------------------+
                             |                 |
 RAM Physical Addr:     0x04 +-----shared------+ 0x0a
                             |                 | 
 Process 1 Virtual:  +-------+-----------------+---------+
                    0x00    0x09              0x0f       0xff