2016-12-07 8 views
2

メモリを共有する必要がある2つのプログラムがあります。プログラムAではCの共有メモリにアクセスする際のセグメンテーションフォルト

struct town_t { 
    int population; 
    char * name; 
} 

、データはMMAPを使用して、共有メモリに書き込まれます:のは、この目的のために、この形式の構造体があり、一つのプログラムA、他の1 B.

を呼ぶことにしましょう。これはプログラムAのために働きます(nameのためにstrcpyを使います)

プログラムBの目的は単にデータを読むことです。これもmmapで動作します。共有メモリの​​フィールドへのアクセスは問題なく動作します。ただし、​​フィールドにアクセスすると、セグメント化エラーが発生します。

私はstrcpyを使っていたので、文字列全体が共有メモリになければなりませんか?

次のフラグを使用して、エラーを返さない共有メモリへのポインタを取得します。

tptr = (struct town_t *) mmap(0, 1024, PROT_READ, MAP_SHARED, shm_fd, 0) 

私は実際にプログラムBから文字列(char *)を読み取ることができますか?

+1

'strcpy'を使うことは、文字列が共有メモリにあるかどうかとは関係ありません。どのようなメモリが 'name'を指し、どのようにそのメモリを割り当てましたか? – immibis

+0

@immibis私はstrcpyを共有メモリポインタに使用しています。私はchar * str = "string"で割り振ります。 –

+0

だから、 'tptr = mmap(...);を実行します。 char * str = "文字列"; strcpy(tptr-> name、str); '? – immibis

答えて

1

共有メモリにポインタを置く必要はありません。ポインタは、特定のプロセスのアドレス空間内の場所を示します。別のアドレス空間を持つ別のプロセスには意味がありません。

必要に応じて、文字列データ自体を共有メモリに格納することができます(同じ実行可能ファイルを実行している関連プロセスによってアクセスされたforkへの呼び出しの前に割り当てられたメモリへのポインタなどの複雑な例外を除きます)。たとえば、これは動作します:

#define MAX_NAME_SIZE 100 

struct town_t 
{ 
    int population; 
    char name[MAX_NAME_SIZE]; 
}; 
+0

これは動作します。再度、感謝します。 –

関連する問題