Грешка при сегментиране (ядрото е изхвърлено) при опит за запис на цели числа в споделената памет в C

Опитвам се да използвам споделена памет между процесите. Просто внедрявам функциите стъпка по стъпка. Продължавам да получавам Segmentation fault (core dumped), докато се опитвам да напиша нещо в него.

int* ms; // Pointer for milliseconds
int* ns; // Pointer for nanoseconds

void checkArgs(int argc, char* argv[]);
void createSharedMem();
void createSharedMem()
{
    int shmid = shmget(KEY, sizeof(int)*128, IPC_CREAT |0666 );
    if(shmid < 0)
        printf("\n Error creating shared memory");
    ms = shmat(shmid, NULL,0);
    ns = shmat(shmid,NULL,0);
    *ms = 0;
    *ns = 0;
}


int main(int argc, char* argv[])
{

    checkArgs(argc,argv);
    createSharedMem();            

    *ms = 1;
    *ns = 1;

    printf("ms : %d ns : %d", *ms,*ns);

}

person DuskXtremeX    schedule 27.02.2019    source източник
comment
Да, мислех, че ще поиска кода, след като натиснах продължи, но директно публикува въпроса. Както и да е, добавено сега. ;)   -  person DuskXtremeX    schedule 27.02.2019
comment
Що се отнася до операцията със споделена памет, това изглежда добре. и се опита да изпълни това и получава споделената памет добре и печатът е наред. shmget() постига ли успех? дали грешката в сегментирането е в checkArgs()? поставете още printf, за да проверите позицията на срива.   -  person Deepak    schedule 27.02.2019
comment
Не, възникна грешка, тъй като добавих променливата, за да проверя дали данните се записват в споделената памет. Докато не добавих ms и ns всичко беше наред.   -  person DuskXtremeX    schedule 27.02.2019
comment
Току-що разбрах, че споделената памет не се създава. След като премахнах всички присвоявания на ms и ns, получих Грешка при създаването на споделена памет от проверката.   -  person DuskXtremeX    schedule 27.02.2019


Отговори (1)


Открих проблема. Вместо да дефинирам ключ с помощта на #define KEY и да го използвам в shmget(), използвах key_t, за да създам ключова променлива. Това поправи проблема с „Невалиден аргумент“

Ето актуализирания код:

void createSharedMem()
{
    key_t key;
    int shmid = shmget(key, 4096, 0666 | IPC_CREAT);
    if(shmid < 0)
        perror("\n Error creating shared memory");
    ms = shmat(shmid, NULL,0);
    ns = shmat(shmid,NULL,0);
    *ms =0
    *ns=0;
    printf("%d",*ms);
}
person DuskXtremeX    schedule 27.02.2019
comment
Този ключ трябва да има правилен номер и трябва да бъде уникален за процес/нишка на писане и четене, за да се създаде същия идентификатор на споделена памет. това трябва да е добре и с твърдо кодирана стойност. просто преминете 1000 като ключ и трябва да работи добре. обикновено този ключ се генерира с помощта на ftok (). - person Deepak; 27.02.2019