内存映射文件在 ecryptfs 目录中失败
Memory mapped files failing in ecryptfs directory
在常规 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();
}
谁能解释一下?
您应该检查每个系统调用的 return 代码。特别是 fallocate() 和 mmap()。
少数文件系统支持 fallocate()。如果 fallocate() 失败(errno 设置为 EOPNOTSUPP),您应该使用 ftruncate()。
在常规 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();
}
谁能解释一下?
您应该检查每个系统调用的 return 代码。特别是 fallocate() 和 mmap()。
少数文件系统支持 fallocate()。如果 fallocate() 失败(errno 设置为 EOPNOTSUPP),您应该使用 ftruncate()。