Ошибка отображения файлов в памяти в каталоге ecryptfs

На обычном компьютере с Ubuntu следующий тест завершается успешно, если я не запускаю его в своем домашнем каталоге, и в этом случае происходит сбой с ошибкой шины. Все, что я могу думать, это то, что домашний каталог зашифрован. (Я нахожу там ссылки Private и.ecryptfs.)

// Make with g++ -mcmodel=large -fPIC -g -O0 -o checkmm checkmm.c

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>

#define TALLIES "tallies.bin"
#define NUM_TALLIES (550588000/sizeof(int))
typedef struct { int tallies[NUM_TALLIES]; } World;
World* world;

void loadWorld() {
  int fd = open(TALLIES, O_RDWR | O_CREAT);
  if (fd == -1) { printf("Can't open tallies file %s\n", TALLIES); exit(0); }
  fallocate(fd, 0, 0, sizeof(World));
  world = (World*) mmap(0, sizeof(World), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
  if (world ==(World*) -1) { printf("Failed to map tallies file %s\n", TALLIES); exit(1); }
}

void unloadWorld() { munmap(world, sizeof(World)); }

void resetWorld() {
  int i;
  for (i=0;i<NUM_TALLIES;i++) world->tallies[i]=-1;
}

int main() {
  loadWorld();
  resetWorld();
  unloadWorld();
}

Кто-нибудь может объяснить?

1 ответ

Решение

Вы должны проверить коды возврата для каждого системного вызова. Особенно fallocate() и mmap().

Fallocate () поддерживается на нескольких файловых системах. Вы должны использовать ftruncate(), если fallocate() завершится неудачно (с errno, установленным в EOPNOTSUPP).

Другие вопросы по тегам