[解決済み] fork() は予想以上に分岐する?
2022-04-15 01:02:03
質問
次のようなコードを考えてみましょう。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for(i = 0; i < 2; i++)
{
fork();
printf(".");
}
return 0;
}
このプログラムでは8個のドットを出力しています。どうしてそんなことが可能なのでしょうか?6個のドットでよいのでしょうか?
解決方法は?
その
fork()
プリミティブは、しばしば想像の域を出ません。 感覚をつかむまでは、それぞれの操作が何であるかを紙にトレースして、プロセスの数を考慮する必要があります。 fork() が現在のプロセスのほぼ完全なコピーを作成することを忘れないでください。 最も大きな違いは、(ほとんどの目的に対して)
fork()
の戻り値は親と子で異なります。 (このコードでは返り値を無視しているので、違いはありません)。
つまり、最初は1つのプロセスが存在します。 それが2つ目のプロセスを作り、両方ともドットを表示してループする。 2回目の繰り返しでは、それぞれが別のコピーを作成するので、4つのプロセスがドットを表示して終了します。 つまり、6個のドットは簡単に計算できるわけです。
しかし
printf()
は、その出力をバッファリングしています。 そのため、プロセスが2つしかなかったときの最初のドットは、書き込まれても表示されません。 これらのドットはバッファに残り、それはfork()で複製される。 バッファリングされたドットが現れるのは、そのプロセスが終了しようとするときである。 4つのプロセスがバッファリングされたドットを印刷し、新しいドットを追加すると、8つのドットになります。
もし、このような動作を避けたい場合は
fflush(stdout);
の後に
printf()
.
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】'cout'は型名ではない
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] <は<=より速いのか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み】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-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー