2017-03-13 5 views
0

Sur une machine ubuntu standard, le test suivant réussit sauf si je l'exécute dans mon répertoire personnel, auquel cas il se bloque avec une erreur de bus. Tout ce que je peux penser, c'est que c'est parce que le répertoire personnel est crypté. (Je trouve des liens privés et .ecryptfs là.)Les fichiers mappés en mémoire échouent dans le répertoire 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(); 
} 

Quelqu'un peut-il nous éclairer?

Répondre

1

Vous devez vérifier les codes retour pour chaque appel système. Notamment fallocate() et mmap().

fallocate() est pris en charge sur une poignée de systèmes de fichiers. Vous devriez utiliser ftruncate() si fallocate() échoue (avec errno défini sur EOPNOTSUPP).

+0

Frapper la cible, Ricardo! –