7

共有メモリを介して通信している 2 つのプロセス (クライアントとサーバー) があります。

動的 (パラメーターに基づく) 2D 配列を作成する必要があります。配列は構造体に格納され、共有セグメントに書き込まれます。

配列を共有メモリに書き込むことはできますが、他のプロセスから取得することはできません。

クライアントコード:

struct shared_use_st {
    int     written_by_you;
    int     **PID_PRI_array;
};
            /* Prepare Dynamic 2D array */
        data_store = malloc(/*ROWS*/ 5 * sizeof(int*));
        for(i=0;i<5; i++)
            data_store[i] = malloc(/*COLS*/ 2 * sizeof(int));


        /* Prepare Dynamic 2D array - Shared Memory Seg */
        shared_stuff->PID_PRI_array = malloc(/*ROWS*/ 5 * sizeof(int*));
        for(i=0;i<5; i++)
            shared_stuff->PID_PRI_array[i] = malloc(/*COLS*/ 2 * sizeof(int));


        /* Write PID and PRI to data_store array */
        data_store[0][0] = pid;
        data_store[0][1] = 1;

        data_store[1][0] = 12345;
        data_store[1][1] = 2;

        data_store[2][0] = 12346;
        data_store[2][1] = 3;

        data_store[3][0] = 12347;
        data_store[3][1] = 4;   

        data_store[4][0] = 12348;
        data_store[4][1] = 5;   

            for(i=0;i<5;i++){
                for(x=0;x<=1;x++){
                    shared_stuff->PID_PRI_array[i][x] = data_store[i][x];
                }
            }

サーバーコード:

    for(i=0;i<5;i++){
    printf("PID: %d, PRI:%d\n", shared_stuff->PID_PRI_array[i][0], shared_stuff->PID_PRI_array[i][1]);              
}

「セグメンテーション違反」エラーが発生します。

ありがとう。

4

1 に答える 1

6

オブジェクトが共有メモリにある場合でもshared_stuff、配列を共有メモリに書き込んでいません。でスペースを割り当てmalloc、そのスペースにデータを書き込んでから、そのスペースへのポインタをに入れますshared_stuffmalloc作成した共有メモリセグメントではなく、現在のプロセスの通常のアドレス空間内にスペースを割り当てます。配列の内容を共有メモリに書き込む必要があります。

共有メモリセグメント内にアレイ用の十分なスペースがあると仮定すると、を使用せずに、アドレスを自分で管理する必要がありますmalloc。(十分なスペースがない場合は、共有メモリセグメントを大きくするか、時間の経過とともに情報を分割して伝達する必要があります。)

次のように、共有メモリセグメント内に可変長配列を配置できます。

まず、アレイサイズなど、必要なすべての「管理」情報を含む構造を定義します。

struct StuffStruct
{
    size_t NumberOfRows, NumberOfColumns;
    … Other information as desired.
};

その構造体へのポインタを作成し、共有メモリセグメントを指すように設定します。

struct StuffStruct *Stuff = shm;    // shm contains the address from shmat, performed previously.

必要な列数の配列へのポインタを作成し、初期構造の後で共有メモリセグメントを指すように設定します。

int (*data_store)[NumberOfColumns] = (int (*)[NumberOfColumns]) ((char *) Stuff + sizeof *Stuff);

(C純粋主義者への注意:はい、C標準は、このようなポインター演算を行ったときに何が起こるかを保証しません。ただし、共有メモリーのサポートを提供する実装は、この種のポインター演算のサポートを提供する必要があります。)

共有メモリセグメントのサイズを超えてはsizeof *Stuff + NumberOfRows * NumberOfColumns * size(int) ならないことに注意してください。それ以外の場合は、次の手順で共有メモリセグメントをオーバーランします。

次のステップでは、配列にデータを入力しますdata_store。通常の2次元配列の場合と同様に、の要素に値を割り当てます。

サーバーでStuffも同じように設定します。次に、クライアントが共有メモリセグメントを書き込んだ後、から行と列の数を読み取りますStuff。次にdata_store、同じように設定します。次に、から読み取りますdata_store

于 2013-02-26T21:44:06.180 に答える