2016-08-05 4 views
-1

私が達成したいのは以下の通りです: 自身のプロセスを使わない新しいchildprocess(pchild)を生成しますが、parentprocess(pparent) 。それ自身のメモリコピーを使用しない子プロセスをforkする

なぜこの動作を達成したいのですか: 最初のテストでセグボルトが発生する複数のテストについて考えてみましょう。 通常、プロセスはsegfaultによって停止し、他のすべてのテストはもう実行されません。したがって、私は独自のプロセスで各テストをカプセル化したいと思っています。

主な問題: 私はプロセスを生成したら、それは(まあ、私はこれが原因「コピーオンライト」技術に、すべてのOSのために完全に真実ではないという事実を認識して だ)独自のメモリコピーを取得します。たとえば、私は他のノードへの2つのポインタを持つノード構造を持っているツリーのfunctionallityをテストします。例えば、私がノードを一度検索すると、パイプまたはいくつかの共有メモリブロックを使用してこれらのポインタは、pchildのメモリブロックの一部であるアドレスを指しているので、ノード構造内のポインタに従うことによって子ノードを得るためにpparentから試してみるとsegvaultを取得します。

スレッドは、一度segfaultが発生した場合のOSの主な動作のために有用ではありません。 (「不明な国家のために子供と父を殺す」)。私はこれまでのところ(唯一のフォークテスト部分)は何

int main (void) { 
    // forking 
    pid_t pid = fork(); 
    if (pid < 0) { 
     // somewhat went wrong 
     printf("An error occured!"); 
    } else if (pid != 0) {        // inside parent 
     // closing writing end, as not needed 
     if(wait(NULL)!=0){ 
      printf("Segfault in Child\n"); 
     } else { 
      printf("Everyone is done!\n"); 
     } 
    } else { 
     printf("Child forked"); 
     char *s = (char *)0xDEADBEEF; 
     *s = 'a'; 
     printf("this probally is never executed due to segfault\n"); 
    } 
    return 0; 
} 

今私の考えはpchildアクセスにのみpparentのメモリセグメントを聞かせしようとすることです。 どうすればいいですか? Greetings、 Lars

+1

本当に必要ですか? 1つのテストがクラッシュした場合、さらにテストを実行する際のポイントは何ですか? – fuz

+1

Linuxの場合は、 'clone()'を使って実際にこの狂ったスキームを行うことができます。 – EOF

+0

fork_and_exec gdbを実行して、メインプロセスにアタッチします。 – joop

答えて

2

あなたの質問はあまり明確ではありませんが、あなたはXY problemだと思います。

私の理解では、一連のテストを実行することをお勧めします。各テストでは、前回のテストの結果が表示されますが、クラッシュ/失敗したテストは表示されません。この場合、1つのアプローチは次のようになります。

  1. fork各テスト
  2. 前に子供にテストを実行します。
  3. テストが成功した場合は、親を終了させるか、または子供が再びフォークし、その子で次のテストを実行している間に待ってください。テストが失敗した場合は、次のテストを行うためにもう一度親フォークを持ってください。

別のアプローチは、唯一MAP_SHARED|MAP_ANONmmapによって割り当てられた共有メモリにあなたのデータ構造を維持するかもしれないが、一つの試験が不整合な状態でそれらを残した場合は、その後、将来のすべてのテスト結果は、ジャンクになります。

プロセス間ですべてのメモリを共有するという考え方は技術的に可能ですが、お互いの状態を壊すので、すぐに爆発します。

+0

まあ、この答えはそれほど役に立ちません。まずステップ1と2が私がしたいことです。それに伴う問題は何ですか、良い戻り値を取り戻しています。親と子は別々のメモリを持っているので、ポインタを含む構造体を返す(そして子プロセスで割り当てられた)子プロセスから親プロセスへのすべての処理が失敗します。これらのポインタはチャイルド・メモリにつながるので、一度私は親の私がセグメンテーションを取得するときにそれらに従います... –

+0

テストのほとんどはお互いに蓄積していません! - それを言うのを忘れて、申し訳ありません! –

+1

@LarsPrehn:もしあなたが望むのは、子から親に結果を返すことだけです。パイプで送るか、共有mmapを使います。だから私はあなたがXYの問題を抱えていると言いました。あなたは、よく定義された振る舞いを持つ標準的なツールで簡単に何かを達成するためにひどい複雑なハッキングを行う方法を尋ねています。 –

0

すべてのプロセスが他のプロセスにRAMのアドレスを与える方法はありませんので、それは(うまくいけば、番号を送信することができますが、別のvirtual memoryアドレス空間で、それは別の「本当の」場所を指しています)自分のvirtual memoryアドレススペースのしています。

あなたが必要とするのは別のスレッドです。同じプロセスのスレッドは1つのスペースを共有しますvirtual memoryスペース。

+0

"すべてのプロセスには独自の仮想メモリアドレス空間があるため、別のプロセスにRAMアドレスを与える方法はありません" - 確かに真実ではありません! mmapを参照してください... "あなたが必要とするのは別のスレッドです。同じプロセスのスレッドは1つの仮想メモリ空​​間を共有します。 ...私は私の質問に述べたようにスレッドは役に立たない。もし私がすでにそれを知らなかったら、どうすればこの質問を設定することができますか? –

-2

vfork()を使用しようとしています。 fork(); systemcallの代わりに。親プロセスと子プロセスのリソースを共有する 。

+0

'vfork()'が '_exit()'や 'exec()'の後に実行する可能性のある唯一の動作は、OPにどのように役立つかはすぐに分かりません。 – EOF

関連する問題