1

次のfork()呼び出しの出力はどうなりますか?

func(){
fork();
fork();
fork() && fork() || fork();
fork();
print("Saikacollection\n");
}

私はOSを初めて使用するので、誰かがこのコードの答えといくつかの説明を得るのを手伝ってくれますか?SOのfork()についていくつか質問を見つけましたが、あまり理解できませんでした。

4

3 に答える 3

16

Saikacollectionは40、コードへの出力として印刷されます。これは次のように説明できます:-

出力を理解するには、次のことを知る必要があります:-

  • fork()呼び出しが正常に実行されると、新しい子が作成されます。子を作成するプロセスはと呼ばれますparent process.
  • Fork()呼び出しはpid、子の(プロセス識別子)を親に返します
  • Fork()は0子プロセスに戻ります。

ここに画像の説明を入力してください

示されている画像を検討してください:-

規則:プロセスのすべての親(呼び出し元)は、に書き込まれ、。leftでマークされstarます。

fork()
  • 最初はプロセスが1つしかないため、fork()呼び出しで子が作成されます。ツリーのルートをレベル1と見なすと、レベル2で確認できます。親(左)と子(右)の2つのプロセスがあります。

    fork()

  • fork()は、1、2、3、4とマークされたそのようなプロセスをさらに作成します。4つのプロセスすべてがさらに同様のコード構造を通過するため、プロセスの総数は、単一のプロセスが生成する回数4になると言えます。4

    fork()&&fork()||fork()

  • このステートメントを理解するには、Cで、&& operator has more precedence than ||

  • また、firstによって結合された2つのオペランドのgosの&&場合wrongdon't check the second。同様に、firstの2つのオペランドのいずれか||truewe don't check the secondオペランドの場合。
  • 1(マークされた)ノードでのfork()呼び出しを考えてみましょう。2つのプロセスが作成されます。親がreturnとして正の数(pid)を取得している間、子は0を取得します。したがって、親は2番目の演算子を実行し、子は||の後にfork()にジャンプします。図に示されているように。
  • &&fork()4番目のレベルでの親の実行は、1つのプロセスのpidを返します。このプロセスは終了し、そのステップの子は0を取得します。したがって、次の実行に進みます。||fork()
  • レベル5の子の最後の||fork()呼び出しは、結果としてさらにプロセスを生成します
  • したがって、ステップの最後に、図の下線でマークされている5つのリーフ(プロセス)があります。
  • 3つのノードすべてに対して同じことを行っていれば、5*4 = 20プロセスを取得できたはずです。

    fork()

  • Final fork()doublesは、そのステップで使用可能なプロセスの数だけです。

  • したがって、プロセスの総数= 2*20 = 40
于 2012-11-03T01:47:41.733 に答える
1

Saikacollectionは毎回新しい行に32回印刷されます。

于 2012-10-15T12:15:15.997 に答える
0

新しいプロセスをより独立させたい場合は、exec- *ファミリーのfuncitons(POSIX)を見て、フォークしてすぐにフォークプロセスを置き換えることができます(新しくフォークされたプロセスは制御されているため、これを行うことができます)あなたによって); または、popen()も見てください。

于 2016-09-21T06:37:57.403 に答える