IPC を使用して、共有メモリを 2D 配列として割り当てたいと考えています。私は次のことを試しました:
id_shmem = shmget(ipc_key, sizeof(int)*rows*columns, IPC_CREAT|0666);
matrix = (int **)shmat(id_shmem, 0, 0);
問題は、マトリックスに何かを書き込もうとすると、セグメント フォールトが発生することです。
IPC を使用して、共有メモリを 2D 配列として割り当てたいと考えています。私は次のことを試しました:
id_shmem = shmget(ipc_key, sizeof(int)*rows*columns, IPC_CREAT|0666);
matrix = (int **)shmat(id_shmem, 0, 0);
問題は、マトリックスに何かを書き込もうとすると、セグメント フォールトが発生することです。
int** は 2D 配列ではなく、ポインターの配列です。共有メモリセグメントは異なるプロセスの異なるアドレスに割り当てられる可能性があるため、ポインタを共有メモリに格納しないでください。いくつかのインデックスマジックで2D配列を「エミュレート」する、単純でフラットな1D配列を使用してみてください。
x,y -> y*width+x
共有メモリ内の構造体の一般的な方法は、ポインターではなくオフセットを格納することです。これは、メモリが異なるプロセスの異なる仮想アドレスにマップされる可能性があるという事実を回避するためです。
もう 1 つの一般的な方法は、最初のプロセスに OS 提供のマッピングを要求させてから、結果の仮想アドレスを同じメモリに接続する必要がある他のすべてのプロセスに渡し、そのアドレスで固定マッピングを要求させることです。