Ошибка сегментации (сброс ядра) при попытке записи целых чисел в общую память в C

Я пытаюсь использовать общую память между процессами. Я просто реализую функции шаг за шагом. Я продолжаю получать сообщение об ошибке сегментации (сброс ядра), когда пытаюсь что-то записать в него.

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