C 共享内存段故障

标签 c shared-memory mmap

我现在正在开发一个使用共享内存的项目,并且遇到了令人难以置信的段错误。由于某种原因,并非所有分配给 *node 的内存都可以访问。在某个索引处(程序每次运行都相同),内存无法写入。下面是我的代码和一些输出。

int shf = shm_open("/queue", O_RDWR|O_CREAT, 0666);
int success = ftruncate(shf, sizeof(QNode)*numVertices*numVertices);
QNode *node = (QNode*) mmap(NULL, sizeof(QNode)*numVertices*numVertices, PROT_READ|PROT_WRITE, MAP_SHARED, shf, 0); 

int a, b;
for (a=0; a<numVertices; a++) {
    for (b=0; b<numVertices; b++) {
        (node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]).k = a;                
        (node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]).i = b;
        printf("Mapping to offset %d\ti:%d\tk:%d\n", sizeof(QNode)*a*numVertices + sizeof(QNode)*b, (node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]).i,(node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]).k);
    }
}

较小图表上的输出:

// Bunch of output
Offset: 472 i:5 k:6
Offset: 480 i:6 k:6
Offset: 488 i:7 k:6
Offset: 496 i:8 k:6
Offset: 504 i:0 k:7
Offset: 512 i:1 k:1
Offset: 520 i:1 k:1
Offset: 528 i:1 k:0
Offset: 536 i:1 k:1
Offset: 544 i:1 k:1
Offset: 552 i:1 k:0
Offset: 560 i:0 k:0
// More incorrect output down here 

在下面的较大图形输出中,有一些更令人费解的结果,我无法在此处发布 - 在偏移量 7168 处,它开始打印出不可打印的字符。例如,在偏移量 7168 的线路上,我看到 Ma[NUL][NUL][NUL][NUL][SI][NUL][NUL][NUL] 偏移量 7168...这是我实际上可以向您展示的输出较大的图表——在最后一行之后它出现了错误。

在更大的图表上输出:

// Bunch of output
Mapping to offset 9136  i:54    k:17
Mapping to offset 9144  i:55    k:17
Mapping to offset 9152  i:56    k:17
Mapping to offset // This is where it seg faults...

非常感谢任何帮助!

最佳答案

嗯......真的意味着像node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]这样的索引吗? C 会自动将索引乘以所指向的结构的大小,所以我觉得 node[a*numVertices + b] 看起来会更理智。

关于C 共享内存段故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14972486/

相关文章:

python - 如何将 HDF5 数据映射到多个 Python 进程?

c - mmap 在 Intel (i7) 和 Arm 上的不同行为?

c++ - 坏指针 : expression can not be evaluated while parsing tokens

c - 背包变异?

计算大数的生日概率

c - 未初始化的字符数组

java - “共享对象内存”与 'Heap Memory' - Java

C 在具有事件等待的子进程之间共享内存时出错

c - 共享内存和指针

c - 在C mmap文件中写入: Permission denied. Linux