[解決済み] For Loopでfork()がどうなるかをビジュアルに表現する
質問
私は
fork()
の挙動を説明します。今回は
for-loop
. 次のコードを観察してください。
#include <stdio.h>
void main()
{
int i;
for (i=0;i<3;i++)
{
fork();
// This printf statement is for debugging purposes
// getppid(): gets the parent process-id
// getpid(): get child process-id
printf("[%d] [%d] i=%d\n", getppid(), getpid(), i);
}
printf("[%d] [%d] hi\n", getppid(), getpid());
}
以下はその出力です。
[6909][6936] i=0
[6909][6936] i=1
[6936][6938] i=1
[6909][6936] i=2
[6909][6936] hi
[6936][6938] i=2
[6936][6938] hi
[6938][6940] i=2
[6938][6940] hi
[1][6937] i=0
[1][6939] i=2
[1][6939] hi
[1][6937] i=1
[6937][6941] i=1
[1][6937] i=2
[1][6937] hi
[6937][6941] i=2
[6937][6941] hi
[6937][6942] i=2
[6937][6942] hi
[1][6943] i=2
[1][6943] hi
私はとても視覚的な人間なので、物事を本当に理解するためには図式化するしかないのです。私のインストラクターは、8つの ハイ ステートメントが8つあると言いました。私はコードを書いて実行しましたが、確かに 8 つの hi ステートメントがありました。しかし、本当に理解できなかったのです。そこで、次のような図を描きました。
コメントを反映させるために図を更新しました :)
観察結果
- 親プロセス(main)はループを3回反復する必要がある。その後、printfが呼ばれる
- 親プロセスの for ループの各繰り返しで fork() が呼び出されます。
- 各fork()呼び出しの後、iはインクリメントされるので、すべての子はiがインクリメントされる前からfor-loopを開始する。
- 各 for ループの終了時に "hi" が出力されます。
以下は私の質問です。
- 私の図は正しいですか。
-
なぜ
に
のインスタンスがあります。
i=0
が出力されますか? -
どのような値の
i
はfork()の後、各子供に引き継がれるのでしょうか?もし、同じ値のi
が引き継がれるのであれば、いつfork"が止まるのでしょうか? -
常に
2^n - 1
はフォークされた子供の数を数える方法でしょうか?では、ここでn=3
というのは2^3 - 1 = 8 - 1 = 7
の子という意味ですが、どちらが正しいのでしょうか?
どのように解決するには?
以下は、理解するために、まずは
for
のループから始めます。
-
ループは親から始まる。
i == 0
-
親
fork()
の、子1を作成します。 -
これで2つのプロセスができました。どちらも印刷
i=0
. -
両方のプロセスでループが再スタートし、現在
i == 1
. -
親と子1
fork()
で、子2、子3を作成します。 -
これで4つのプロセスができました。4つとも印刷する
i=1
. -
4つのプロセスすべてでループが再スタートし、現在
i == 2
. -
親子1~3人全員
fork()
で、4から7までの子供を作る。 -
これで8つのプロセスができました。8つとも印刷
i=2
. -
8つのプロセスすべてでループが再スタートし、現在
i == 3
. -
ループは8つのプロセスすべてで、次のように終了します。
i < 3
が真でなくなったため、ループは8つのプロセスすべてで終了します。 -
8 つのプロセスすべてが印刷
hi
. -
8つのプロセスすべてが終了します。
ということで、以下のようになります。
0
が2回印刷されます。
1
が4回印刷されています。
2
が8回、そして
hi
が8回印刷されました。
関連
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】fork()、vfork()、exec()、clone()の違いについて)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
initializer element is not constant "というエラーが表示されるのですが?
-
[解決済み] C 言語で const char* を char* に変換するには?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] .aファイル、.soファイルとは何ですか?
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?