2012-04-28 14 views
0

書き込みシステムでは、フォークとそのコピーに問題があります。 params.writersCount procesessを作成し、それぞれの内部ID(1からparams.writersCountまで)を取得する必要があります。だから子供の私は親プロセスを待っています、それは子の内部IDを初期化します(writers [i] = processId)。私はwriterSimulationを呼び出して引数のようなコンテキストアドレスを渡すことができます。なぜなら、context.idはその子の内部IDですから、コピーオンライトシステム(context.id = j + 1はUnixにページをコピーさせるので、各子内部IDを持つコンテキストコピーを所有しています)。しかし、私がwriterSimulation関数でcontext.idを使用しようとすると、私は0を得ています。何が間違っているのですか?フォークと共有ページ

for(int i = 0; i < params.writersCount; i++) 
{ 
    pid_t processId = fork(); 

    if(!processId) 
    { 
     srand((unsigned int)(seconds+getpid())); 
     while(!context.id) 
     { 
      for(int j = 0; j < params.writersCount; j++) 
      { 
       if(writers[j] == getpid()) 
       { 
        context.id = j+1; 
       } 
      } 
      struct timespec wait = {.tv_sec = 0, .tv_nsec = 500000}; 
      nanosleep(&wait, NULL); 
     } 
     int simError = writerSimulation(&context); 
     return simError; 
    } 

    writers[i] = processId; 
} 
+0

首都を含む標準英語を書いてください。 – thb

答えて

0

それは私には完全には明らかではないのですが、あなたは親が子で作家の配列を変更していしようとしているように見えます。それは動作しません。フォークの後、コピーオンライトは子と親の両方に適用されるため、親が作成する書き込みは子には見えません。また、nanosleepを使用して待機することは、リモートで信頼できるものでもありません。子供とやりとりする簡単な方法は、フォークの前にパイプを開き、それを同期やデータの受け渡しに使用することです。単にパイプを親に書き込むようにしてください。子どもはナノスリーピングではなく読み込みをブロックするので、読み込みによって同期が提供されます。

+0

aaaなので、copy on writeが両方に適用される場合、そのプログラムは動作しません。 – Krab

0

フォークの後に親によって割り当てられた値を子アクセスで使用することはできません。あなたの全体的なアプローチがこのように、これは必要ありません

  • 変更 - フォークの前に利用可能か後に親と子の両方に独立して得られた情報に頼る:あり、いくつかのオプションがあります。

  • プロセス間通信 - ソケット、パイプ、共有メモリの手段を使用して、など

関連する問題