Ошибка SIGSEGV при использовании разделяемой памяти в C ++ - PullRequest
1 голос
/ 16 января 2020

Я делаю очень простой IP C между двумя приложениями на Raspberry Pi в Linux, когда одно приложение отправляет, а другое получает

Во время ночного запуска процесс завершился с SIGSEGV ошибка.

При отправке приложения произошел сбой strcpy(str, in_string);

Что вызвало бы этот тип cra sh?

Строки, которые я записываю в память, имеют одинаковый размер, и я предполагаю, что он всегда записывает в одну и ту же ячейку памяти, но я знаю, linux использует виртуальную память, поэтому физический адрес может смещаться.

#pragma once

#include <iostream> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdio.h> 

class LocalSocket {
public:

    LocalSocket() 
    {         // ftok to generate unique key 
        key_t key = ftok("shmfile", 65); 

        // shmget returns an identifier in shmid 
        shmid = shmget(key, 1024, 0666 | IPC_CREAT); 

        // shmat to attach to shared memory 
        str = (char*) shmat(shmid, (void*)0, 0); 
    }

    ~LocalSocket()
    {   
        //detach from shared memory  
        shmdt(str); 

        // destroy the shared memory 
        shmctl(shmid, IPC_RMID, NULL); 
    }

    int shmid;
    char *str;   

    bool Send(char* in_string)
    {
        strcpy(str, in_string);

        printf("Data written in memory: %s\n", str); 


        return true;
    }

    bool Receive(char* out_string)
    {   
        printf("Data read from memory: %s\n", str); 

        strcpy(out_string, str);

        return true;
    }
};
...