Почему эти два адреса не совпадают? - PullRequest
0 голосов
/ 07 марта 2011

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);  
}

shmget2.c:

#include<sys/types.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>

main()
{
    int shmid;
    char* addr1;
    key_t key;


    key = ftok("/home/tamil/myc/pws.c",'T');
    shmid = shmget(key,128*1024,SHM_R|SHM_W);

    addr1 = shmat(shmid,0,0);


    printf("\nIPC SHARED MEMORY");
    printf("\n SENDER ADDRESS");
    printf("\nTHE ADDRESSS IS %p",addr1);
    printf("\nMESSAGE STORED IN %p IS %s",addr1,addr1);

}

Выход:

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$ 

Это все работает хорошо. Но адрес не тот. Почему это?

Ответы [ 2 ]

6 голосов
/ 07 марта 2011

Общая память может быть сопоставлена ​​с различными регионами в адресном пространстве разных процессов.Это совершенно нормально.Но если вы храните указатели в общей памяти для других частей общей памяти, то у вас проблемы.В этом случае вам нужно будет использовать что-то вроде смещенного указателя .

1 голос
/ 07 марта 2011

Адреса, которые вы видите, отличаются, потому что они виртуальные . Каждый процесс получает «притворное» адресное пространство, которое является непрерывным (без пробелов) и со временем может быть увеличено. В действительности виртуальные адреса могут быть сопоставлены с различными частями оперативной памяти порциями. Посмотрите здесь для более подробной информации (в частности, эта диаграмма ). В случае разделяемой памяти существует одна область ОЗУ, которую могут «видеть» оба процесса. Однако для каждого процесса совершенно нормально, чтобы адреса выглядели по-разному.

Вот идея:

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

(Не в масштабе :) Обратите внимание, что процессы 1 и 2 совместно используют одну и ту же область ОЗУ (физический адрес от 0x04 до 0x0a), но эта общая часть ОЗУ отображается в разные части их виртуальных адресных пространств (от 0x09 до 0x0f). для P1; от 0x01 до 0x07 для P2).

...