3

特定のプロセスにスリープ状態を指示する正しい方法は何ですか? 私が作成したさまざまなプロセスを制御する方法を完全には理解していません..

2 秒と 3 秒間スリープする 2 つのプロセスを作成しようとしています。プロセス 1 が 2 秒間スリープし、プロセス 2 がまだスリープしている場合、プロセス 3 をスリープ状態にします。しかし、プロセスにスリープ状態を指示するにはどうすればよいでしょうか? それとも私はしませんか?

int main(void)
{
    pid_t p1 = fork();
    pid_t p2 = fork();
    pid_t p3 = fork();

    //make p1 sleep(2) and p2 sleep(3)
    waitpid(p1, NULL, 0); //waiting for p1 to terminate
    //make p3 sleep(2);
}

ご覧のとおり、プロセスの処理方法も、プロセスが実際に何であるかもわかりません。私はそれらをオブジェクトとして見ていますが、それは間違っていると思います..それについていくつか読んでみましたが、それらはすべて9000ページ以上のPDFです..私がそれらを見るべきものの簡単な説明をいただければ幸いです. はい、これは学校の教材ですが、いいえ、課題ではありません。

4

2 に答える 2

5

man fork9000ページよりわずかに短いものから始めます。主なことは、成功すると2 回fork返されることです。子プロセスには 0 が返され、親プロセスには子の PID が返されます。通常、次のように使用されます。

pid_t pid = fork();
if (pid<0) { /* error while forking */
};
if (!pid) { /* code for child */
  play();
  whine();
  sleep();
  exit(0);
} else { /* code for parent */
  grunt();
  waitpid(...);
}

通常、子プロセスにこれを行うように指示ifすることはなく、適切なブランチにそれを行うコードを追加するだけです。

あなたの例では、すべてのフォークが成功した場合、8 つのプロセスになります。

  1. 最初の fork は新しいプロセスを作成し、新しいプロセスでp10 を取得し、親でいくつかの pid を取得します。
  2. 2 番目の fork は、元の親と子の両方で呼び出され、図に 2 つのプロセスが追加されます。 p2すべての「孫」で 0 を取得し、ステップ 2 の前に存在する 2 つのプロセスで 2 つの異なる pid を取得します。
  3. 3 番目のフォークは4 つの異なるプロセスで呼び出され、さらに 4 つのプロセスが図に追加されます。
于 2013-02-10T15:27:54.057 に答える
4

あなたはそれを送ることができるSIGSTOPSIGCONT思います。

kill(p1, SIGSTOP);

別の方法として、より健全に、フォークするだけでコードを完全に制御できるため、パスを処理できます。

if (in_child_1)
    sleep(..);

補足として、コードでは、予想よりも多くのプロセスが作成されます。モノがp1作成されると、その親と並行して、その時点から実行が開始されます。等々。

于 2013-02-10T15:22:10.967 に答える