Проблемы с mmap внутри функции

#c #signals #mmap #segmentation-fault #mprotect

#c #сигналы #mmap #ошибка сегментации #mprotect

Вопрос:

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

Пожалуйста, игнорируйте заголовки MPI — это для более поздней части проекта. Я закомментировал mprotect строку, чтобы увидеть, что это ошибка mmap, в отличие от обработчика, который не обязательно работает

net_map.cpp:

 #include <iostream>
#include <signal.h>
#include <sys/mman.h>
#include <mpi.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "net_map.h"

using namespace std;

void handler(int sig, siginfo_t* info, void* other)
{
    void* address = info->si_addr;

    cout << "nSegfault Detected! [Address: " << address << "]n" << endl;

    int unprotectresult = mprotect(address, SIZE, PROT_READ|PROT_WRITE|PROT_EXEC);

    if (unprotectresult == 0)
    {
        cout << "nSuccessful mprotect (memory unprotected)!n" << endl;
    }else 
    {
        cout << "nMprotect unsuccessfuln" << endl;
    }
}

void netmap (char filename[], char* mapped)
{
    int file;

    file = open(filename, O_RDWR);

    mapped = (char*) mmap(NULL, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, file, 0);

    if (mapped == MAP_FAILED)
    {
        cout << "nMap Failed!" << endl;
    }

    cout << mapped << endl;
}
  

main.cpp

 #include <iostream>
#include <signal.h>
#include <sys/mman.h>
#include <mpi.h>
#include <unistd.h>
#include <array>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <array>
#include "net_map.h"


using namespace std;

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

    struct sigaction segaction;

    memset(amp;segaction, 0, sizeof(segaction));
    segaction.sa_flags = SA_SIGINFO;
    sigemptyset(amp;segaction.sa_mask);
    segaction.sa_sigaction = handler;
    sigaction(SIGSEGV, amp;segaction, NULL);

    int i;

    char* mapped;

    networkpage sheet;

    char filename[] = "hello.txt";

    netmap(filename, mapped);

    sheet.address = (void*)mapped;

    cout << "nAddress: " << sheet.address << endl;

    //mprotect(sheet.address, SIZE, PROT_NONE);

    memcpy(sheet.address, "k", 1);

    munmap(sheet.address, SIZE);

    return 0;
}
  

Комментарии:

1. Ваша netmap функция не возвращает отображенный адрес — она присваивает значение локальному параметру. Вам нужно будет передавать отображенный указатель по указателю или ссылке, чтобы это сработало. Вы также могли бы изменить его, чтобы просто возвращать значение.

2. Большое спасибо! Передано по ссылке, и теперь оно работает идеально