0

現在、共有メモリを使用するプロジェクトに取り組んでおり、気が遠くなるようなセグメンテーション違反が発生しています。何らかの理由で、*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...

どんな助けでも大歓迎です!

4

1 に答える 1

2

うーん...本当にインデックスのような意味node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]ですか?Cは、ポイントされている構造体のサイズでインデックスを自動的に乗算するので、node[a*numVertices + b]もっと正気に見えるように感じます。

于 2013-02-20T04:51:21.803 に答える