2

2 つのプロセス間で共有メモリを作成したい。fork() を使用しました。子供はこの共有メモリを変更しようとし、母親は別の子供を作成するため、新しい子供は同じメモリを変更しようとします。これがCプログラミングの私のコードです。(ubuntu)

mylist ch=NUL; 
f=fork();
if(!f){
        pba=shmget(KEYSHM,sizeof(char),0); /*created shared memory*/
        ch=(mylist *) shmat(pba,0,0);
        ch->name=ugur;
        ch->surname=cedric;
...do something...
}
else{
        if(ch)
        printf("this is top of mylist %s"ch->name);
.......do something
}

ch->name とは決して書きません。なぜ?共有メモリを作成しました。親プロセスが読み取れないのはなぜですか?

4

6 に答える 6

6

メモリを共有するには、親と子の両方が同じ共有メモリにアクセスする必要があります。

簡単な方と難しい方の 2 つのオプションがあります。

  • フォークする前に、共有メモリを作成してアタッチします。親と子の両方が自動的に同じ共有メモリにアクセスできます。

  • 最初に fork してから、親と子の両方を共有メモリに個別にアタッチする必要があります。プロセスが分岐すると、メモリを共有しなくなります。特に、子プロセスに割り当てられたものには、親プロセスではアクセスできません。

名前などの有用な文字列を格納するには、共有メモリの複数の文字を割り当てる必要があります。

于 2009-12-26T16:51:40.337 に答える
3

親が子の前に実行され、子がそこに何かを配置する前に ch-> にアクセスしようとするとどうなりますか?

また、1バイト(sizeof(char))のみを割り当てますが、それを構造体へのポインターとして処理しようとしています-mylistに十分なスペースを割り当てる必要があります-以前にそうしなかった場合を除きます。どこかでshmgetするには、IPC_CREATフラグも必要です。

于 2009-12-26T15:52:39.427 に答える
1

コードの書き方では、ch は共有メモリを指しますが、ch 自体 (つまりポインタ) は共有されません。ch の割り当ては子でのみ発生するため、親は引き続き ch を NULL と見なします。

これを修正するには、次の 2 つの方法があります。

  1. フォークの前に共有メモリを設定します。
  2. 親と子の両方が同じ共有メモリを開くようにします。

共有メモリ内のレコードを操作する場合、そのレコードのすべてのデータが共有メモリ内に存在することを確認する必要があります。たとえば、次のコードで:

    ch->name=ugur;
    ch->surname=cedric;

mylist::name は char * のようです。ch が共有メモリ内のレコードを指している場合、これはポインタを共有メモリ内の名前に配置するだけです。これらの文字列を共有メモリに配置する特定の手順を実行しない限り、これらの文字列は通常のメモリに配置され、おそらく他のプログラムからアクセスできなくなります。

于 2009-12-26T16:42:11.323 に答える
1

最初に実行された親プロセスは、まだ実行されていないためアクセスできませch->nameん 。共有メモリについては、このチュートリアルとこのpdf ファイルch->name=ugur;を参照することをお勧めします。前に共有メモリを取得して、子と親で使用すると 思う1つの解決策。
fork()

于 2009-12-26T15:58:36.170 に答える
0

フォークする前に共有メモリを作成してアタッチすると、共有メモリが NULL かどうかを確認できません。付けたまま起動します。

于 2009-12-26T18:42:16.230 に答える
0

また、アクセス権などを指定するフラグや、共有メモリ セグメントを作成する必要があるかどうかを指定するフラグにも 0 を使用しました。つまり、自分自身に読み取りまたは書き込みアクセス権を与えておらず、セグメントがまだ存在しない場合に作成するように指定していません。

于 2013-03-15T19:22:40.957 に答える