Проблема инициализации общей памяти (c) - PullRequest
1 голос
/ 11 декабря 2010

Я работаю с общими сегментами памяти и столкнулся с этой странной проблемой.

Я пытаюсь разделить структуру между многими процессами:

struct shmstruct{
    int pid[50];
    char user[50][10];
};

struct  shmstruct *shmobj;
void    *shmp;

int main()
{
    //server creates shared memory
    if((shmid = shmget((key_t)1234,sizeof(struct shmstruct),0666|IPC_CREAT)) == -1){
        fprintf(stderr,"shmget failed\n");
        exit(EXIT_FAILURE);
    }

    //server attaches shared memory segment to pointer (void *)
    if((shmp = shmat(shmid,(void *) 0,0)) == (void *)-1){
        fprintf(stderr,"shmat failed\n");
        exit(EXIT_FAILURE);
    }

    //structure is now linked with shared memory pointer
    printf("Memory attached at %X\n",shmp);
    shmobj = (struct shmstruct *)shmp;

    int i;
    for(i = 0; i < 50; i++)
        if(shmobj->pid[i]!=0)
            printf("shminit:i:%d user:%s pid:%d\n", i, shmobj->user[i], shmobj->pid[i]);
}

Но всякий раз, когда я создаю и присоединяюсегмент общей памяти shmobj-> pid [1] уже инициализирован значением 2673!

В результате printf ВСЕГДА:

shminit:i:1 user: pid:2673

Есть идеи, почему это происходит?
Заранее спасибо!

1 Ответ

3 голосов
/ 11 декабря 2010

Сегменты общей памяти не обязательно исчезают, когда от них отрываются все процессы.Есть большая вероятность, что ваш сервер просто подключается к уже существующему сегменту.

IPC_CREATE не принудительно создание, он позволяет создать , если сегментеще не существует.

Вы можете использовать shm_unlink() для правильного удаления сегментов совместно используемой памяти или командную строку shmdel для проверки, что это будет работать.

...