Ошибка шины с областью памяти mmap - PullRequest
0 голосов
/ 29 июня 2018

В следующей простой программе:

# include <sys/mman.h>
# include <fcntl.h>
# include <cstdlib>

# include <cassert>

struct rgn_desc
{
  size_t end_;
  char data[];
};

int main(int argc, const char *argv[])
{
  int fd = open("foo.mm", O_RDWR|O_CREAT|O_TRUNC, (mode_t)0700);

  assert(fd != -1);

  void * ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
                    MAP_SHARED | MAP_POPULATE, fd, 0);

  assert(ptr != (void*) -1);

  rgn_desc * rgn_ptr = (rgn_desc*) ptr;
  rgn_ptr->end_ = 0; // <-- bus error
}

По сути, я хочу управлять простым mmaped распределителем арены и сохранять в качестве первой части отображения выделенные мною байты. Итак, когда я восстановлюсь из файла, я получу, сколько байтов было выделено.

Однако последняя строка дает мне bus error. Может ли кто-нибудь объяснить, почему и, если возможно, предложить мне способ избежать этого. Я использую Linux на 32-битном Pentium и использую компилятор clang ++

1 Ответ

0 голосов
/ 29 июня 2018

Согласно документу, шина sig может сработать, если:

SIGBUS
    Attempted access to a portion of the buffer that does not
    correspond to the file (for example, beyond the end of the
    file, including the case where another process has truncated
    the file).

Размер файла не совпадает с размером mmap() (0, 4096), поэтому вы можете использовать ftruncate() для увеличения размера файла. файл.

ftruncate(fd, 4096);
...