2017-03-13 46 views
0

일반적인 우분투 컴퓨터에서 홈 디렉토리에서 실행하지 않으면 다음 테스트가 성공합니다.이 경우 홈 오류가 발생하여 버스 오류가 발생합니다. 내가 생각할 수있는 것은 홈 디렉토리가 암호화되어 있기 때문이라고 생각할 수 있습니다. (개인 및 .ecryptfs 링크가 있습니다.)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()는 소수의 파일 시스템에서 지원됩니다. fallocate()가 실패 할 경우 (errno를 EOPNOTSUPP로 설정) ftruncate()를 사용해야합니다.

+0

강타, Ricardo! –