5

2つのプロセス間で文字列を共有する必要があるプログラムがあります。の配列を含む構造体を宣言しました*char。この構造体は、メインプロセスがフォークされる前に割り当てられshmgetます。shmat

typedef struct Queue
{
    int index;
    char *directory[10];
} Queue;

プロセスの1つで、値を設定しようとします:(data->dir_name*char"/ data1"などの文字列になります)

queue->directory[i] = data->dir_name; // Option 1
queue->directory[i] = "foo";          // Option 2

私の質問は、上記の最初のステートメントと2番目のステートメントの違いは何ですか?に設定するqueue->directory[i]"foo"、他のプロセスがそれを認識します。ただし、値を渡すと、渡さdata->dir_nameれません。

前もって感謝します!

4

1 に答える 1

5

問題は、文字列データをコピーするのではなく、ポインタを割り当てるだけであるということです。最初のケースでは、2番目のプロセスが認識できないメモリを指すように値を設定しています。最初の行を実行すると、ポインタdata->dir_nameはに置かれますがqueue->directory[i]、他のプロセスが自身のメモリ空間内のそのメモリアドレスを調べると、データはそこにありません。一方、2行目は、静的文字列のアドレスを"foo"変数に入れます。プロセスは同じソースからコンパイルされるため、その文字列は各プロセスのメモリ内の同じ場所にあり、2番目の文字列で確認できます。

あなたがしたいのはstrcpy、ディレクトリ名を入れる構造体にバッファを置くことです。あなたは必要になるでしょう

char directory[10][200];

strcpy (queue->directory[i], data->dir_name);

文字列の長さが200未満(この場合)であることを確認し、長すぎる場合は適切なエラーを報告する必要があります。私は、malloc同等の方法を正確に知るための共有メモリ関数に精通していません。あなたがそれをすることができれば; 次に、文字列をed共有メモリにコピーmallocし、コードと同じようにその文字列へのポインタを配列に配置します。しかし、非常に迅速なGoogle検索から、mallocこのような共有メモリを使用することはあまりうまく機能しない可能性があるようです。

于 2013-03-20T21:29:10.877 に答える