我无法访问我正在使用mmap的全局结构指针。试图在throw segfaults中声明的函数之外的函数中访问结构的成员。
结构:
typedef struct foo {
uint32_t size;
bar_t array[0];
} foo_t;
初始化:
foo_t* foo; // global
static void* init_function(...) {
fd = open(filename, O_CREAT | O_WRONLY, 0644);
write(...);
lseek(...);
write(...);
foo = mmap(0, BIG_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
foo->size = 0;
}
导致段错误的原因:
static int another_function(...) {
if (foo->size == 0) {...} //foo->size causes it
}
BIG_SIZE是一个定义的值,应该足够大以满足我的需求。
任何方式,我为(...)s道歉,但这是问题出现的地方。我已经研究过mmap docs和可变长度方法而没有运气。提前谢谢!
答案 0 :(得分:0)
您没有向我们展示所有内容,但您似乎只是分配了全局变量,但是您没有初始化映射区域的内容。你应该至少给它一个
foo->size = 0
某处,如果文件是新创建的,或者您应该使用ftruncate
而不是fseek write
序列来保证块(包括size
)为{{1}填充。
答案 1 :(得分:0)
首先检查mmap是否真的成功了:
foo = mmap(...);
if(MAP_FAILED == foo) { //对我没有记忆...... }
如果我没记错的话,该文件的长度必须至少BIG_SIZE
,否则mmap
会失败 - 但我可能错了......