C разделение памяти между 2 программами - PullRequest
1 голос
/ 12 марта 2012

У меня есть 2 программы писатель и читатель. Предполагается, что записывающее устройство создает разделяемую память, а затем сохраняет массив структур в этом фрагменте памяти ... считывающее устройство должно использовать этот фрагмент памяти и иметь возможность выводить то, что записано в памяти записывающим устройством. Я очень стараюсь вывести больше, чем просто первую часть массива, так что я даже не уверен, правильно ли массив сохраняется в общую память, поэтому я сказал, что выложу свой код здесь, и, возможно, кто-то может мне помочь вне ...

ПИСАТЕЛЬ:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <unistd.h>
#include "header.h"


int main()
{
    key_t key = 1234;
    int shmid;
    int i = 0;
    int p;
    struct companyInfo * pdata[4];

    for (i = 0; i < 5; i++)
    {
        pdata[i] = malloc(sizeof(struct companyInfo));
        p = sizeof(struct companyInfo);
        //printf("size: %d\n", p);
        //printf("look: %x\n", pdata[i]);
    }

    int sizeOfCompanyInfo = sizeof(struct companyInfo);

    int sizeMem = sizeOfCompanyInfo*5;

    shmid = shmget(key, sizeMem, 0644 | IPC_CREAT);
    if(shmid == -1)
    {
        perror("shmget");       
        exit(1);
    }

    *pdata = (struct companyInfo*) shmat(shmid, (void*) 0, 0);
    if(*pdata == (struct companyInfo*) -1)
    {
        perror("schmat error");
        exit(1);
    }

    strcpy(pdata[0]->companyName,"AIB");
    pdata[0]->sharePrice = 11.2;
    strcpy(pdata[1]->companyName,"BOI");
    pdata[1]->sharePrice = 10.2;
    strcpy(pdata[2]->companyName,"TSB");
    pdata[2]->sharePrice = 9.2;


    printf("name is %s and %f \n",pdata[0]->companyName,pdata[0]->sharePrice);
    printf("name is %s and %f \n",pdata[1]->companyName,pdata[1]->sharePrice);
    printf("name is %s and %f \n",pdata[2]->companyName,pdata[2]->sharePrice);

    exit(0);

}

ЧИТАТЕЛЬ:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <unistd.h>
#include "header.h"

int main()
{
    key_t key = 1234;
    int shmid;
    int sizeMem = 100;

    struct companyInfo * pdata[4];

    //int sizeOfCompanyInfo = sizeof(pdata);

    //printf("Size: %d\n", sizeOfCompanyInfo);

    shmid = shmget(key, 0, 0);
    if(shmid == -1)
    {
        perror("shmget");       
        exit(1);
    }

    *pdata = (struct companyInfo*) shmat(shmid,(void*)0,0);
    if(*pdata==(struct companyInfo*) -1)
    {
        perror("shmat error");
        exit(1);
    }

    printf("The id is %d\n",shmid);

    printf("Bank is %s and %f . \n",pdata[0]->companyName,pdata[0]->sharePrice);
    printf("Bank is %s and %d . \n",pdata[1]->companyName,pdata[1]->sharePrice);
    printf("Bank is %s and %d . \n",pdata[2]->companyName,pdata[2]->sharePrice);
    exit(0);
}

HEADER:

struct companyInfo
{
    double sharePrice;
    char companyName[100];
}; 

1 Ответ

2 голосов
/ 12 марта 2012

Проблема в том, что ваши pdata являются массивом указателей на структуры, и когда вы выполняете shmat (), вы устанавливаете только первый указатель в вашем массиве (* pdata).Поэтому, когда вы пишете в структуры, на самом деле в разделяемую память попадает только ноль, остальные идут в пространство, которое вы ранее размещали (что вам не следует делать).

Правильнопуть выглядит примерно так:

int main()
{
    key_t key = 1234;
    int shmid;
    int i = 0;
    int p;
    struct companyInfo *pdata;
    int ncompanies = 5;

    int sizeMem = sizeof(*pdata) * ncompanies;

    shmid = shmget(key, sizeMem, 0644 | IPC_CREAT);
    if(shmid == -1)
    {
        perror("shmget");       
        exit(1);
    }

    pdata = (struct companyInfo*) shmat(shmid, (void*) 0, 0);
    if(pdata == (void*)-1)
    {
        perror("schmat error");
        exit(1);
    }

    strcpy(pdata[0].companyName,"AIB");
    pdata[0].sharePrice = 11.2;
    strcpy(pdata[1].companyName,"BOI");
    pdata[1].sharePrice = 10.2;
    strcpy(pdata[2].companyName,"TSB");
    pdata[2].sharePrice = 9.2;

    exit(0);

}

Здесь хранятся все структуры в общей памяти, а не только указатели.

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

...