私はすでに似たような投稿を見ましたが、私が探していたものではありませんでした。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()関数で
あなたが任意のヒントを持っている場合、私はそれらを大幅にいただければと思います。ありがとう!
'shm_open' POSIX API呼び出しのマニュアルページを見てください。共有メモリ領域を作成し、両方のプロセスがアクセスする変数をそこに配置したいとします。あなたは 'mmap'呼び出しでこれをかなり簡単に行うこともできます。あなたのアクセスはスレッドセーフであることを確認してください...共有メモリの使用に固有のロックはないので注意が必要です。 – Borealid
'shm_open'で' ftruncate'を呼び出して共有メモリオブジェクトのスペースを割り当てる必要がありますので、メモリオブジェクト内のスペースは 'std ::ベクトル。スペースが必要な場合は、実行時に共有メモリオブジェクトのサイズを手動で管理する必要があります。 – Jason
これはCコードではありません。 – Puppy