2011-06-23 7 views
7

私はすでに似たような投稿を見ましたが、私が探していたものではありませんでした。fork()で共有メモリを使用

基本的には、私はOdd-Even Sortをフォークで実行しようとしているので、子供はオッズを実行し、親はevensを実行します。これらは、どちらもベクトルinputValuesとboolean sortedの共有を必要とします。

次のコードは、メモリを共有で私の失敗のいずれかなしで、検索アルゴリズムとフォークを使うためだけの基本的なフレームワークです:私はこの共有をハッキングする複数の方法を試してみた

while(!sorted) 
{ 
    pID = fork(); 
    sorted = true; 
    cout << "Sort set to TRUE." << endl; 

    if(pID == 0) 
    { 
     int num = 1; 
     cout << "Child swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
     exit(0); 
    } 
    else if(pID < 0) 
    { 
     cout << "Failed to fork." << endl; 
     exit(1); 
    } 
    else 
    { 
     wpid = waitpid(pID, &status, waitStatus); 
     int num = 0; 
     cout << "Parent swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
    } 
} 

どのように動作するのか、私が必要とするもの、そしてそれを行うための最良の方法を実際に説明するリソースを見つけることはできません。次のように

だから、私の要件は次のとおりです。

  • 親と子は、グローバルベクトルとを共有し、操作することができなければなりませんブール
  • を示すように、これは、ループ内で実行できる必要があります
  • これは、(メインで使用されている変数と協力しなければならない)とswap()関数で

あなたが任意のヒントを持っている場合、私はそれらを大幅にいただければと思います。ありがとう!

+0

'shm_open' POSIX API呼び出しのマニュアルページを見てください。共有メモリ領域を作成し、両方のプロセスがアクセスする変数をそこに配置したいとします。あなたは 'mmap'呼び出しでこれをかなり簡単に行うこともできます。あなたのアクセスはスレッドセーフであることを確認してください...共有メモリの使用に固有のロックはないので注意が必要です。 – Borealid

+0

'shm_open'で' ftruncate'を呼び出して共有メモリオブジェクトのスペースを割り当てる必要がありますので、メモリオブジェクト内のスペースは 'std ::ベクトル。スペースが必要な場合は、実行時に共有メモリオブジェクトのサイズを手動で管理する必要があります。 – Jason

+0

これはCコードではありません。 – Puppy

答えて

4

shmget()shmat()を使用して共有メモリオブジェクトをセットアップする必要がありますが、残念ながらそれはstd::vectorのような動的メモリオブジェクトではありません。言い換えると、共有メモリオブジェクトの初期化の時点でオブジェクトのサイズ全体を宣言する必要があります。あなたの親では、shmget()にIPC_CREATフラグを付けてコールし、共有メモリオブジェクトを作成し、そのオブジェクトのID値を取得するというプロセスはかなり簡単です。次にID値を持つshmat()を呼び出して、オブジェクトへのポインタを取得します。次に、デフォルト値でオブジェクトを初期化します。あなたの子プロセスにforkするとき、shmat()から返されたポインタは、子プロセスでも有効なので、同じポインタ変数を使って親と子の両方でメモリを共有できます。

また、あなたはどんな子供たち0よりも大きな値に設定pshared属性でsem_init()を使用してセマフォをforkする前に、親プロセスに宣言したいと思います。次に、親プロセスと子プロセスの両方がセマフォを使用して共有メモリオブジェクトへのアクセスを制御できます。

ただし、共有メモリオブジェクトは動的オブジェクトではないことに注意してください。そのため、初期化時に十分な領域を確保する必要があります。

関連する問題