• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlのwhile loop内のforkについて)

perlのwhile loop内のforkについて

このQ&Aのポイント
  • perlのfork機能を使いたい者ですが、その挙動について質問しています。
  • 質問内容を具体的にするため、以下に簡単なコードを書いておきます。
  • なぜ、「parent finish」が4回も出てくるのかということです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

プロセスIDを付けると何がおこっているのかわかりますよ。 以下、$$はプロセスIDを表わしています。表示がくずれるので空白2文字を全角空白にし ていることに注意。 use strict; use warnings; my $i = 0; while ( $i < 3 ) {   if ( fork() ) {     print "parent($$) hello -> $i\n";     last;   }   else {     print "child($$) hello -> $i\n";     sleep 3;     print "child($$) exit -> $i\n";     $i++;   } } print "parent($$) finish\n"; --- $ perl -w foo.pl parent(24503) hello -> 0 parent(24503) finish child(24504) hello -> 0 child(24504) exit -> 0 parent(24504) hello -> 1 parent(24504) finish child(24510) hello -> 1 child(24510) exit -> 1 parent(24510) hello -> 2 parent(24510) finish child(24511) hello -> 2 child(24511) exit -> 2 parent(24511) finish

nagoyan_nagoyan
質問者

お礼

ありがとうございます。 確かにプロセスIDを表示するとわかりやすかったです。 理解した部分では、 fork -> プロセスが2つ作成される(ここでは、24503と24504)。 そのうちの一つ(24503)は、if statement内にある”parent(24503) hello -> 0”を経て、 lastがあるため、 while loopから抜け出て、最後の”parent(24503) finish”(ここでは、24503プロセスが終了している)がプリントされる。 先に作成された別のプロセス(24504)は、elseに入り、プリントを経て、$iをインクリメントして、while loopのチェックを受け、次につながる。 このため、複数回"parent($$) finish\n"がプリントされていたのですね。 勉強にもなりましたし、大変スッキリしました。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ん~と, どこが不思議なのかわからんのだけど.... fork で生まれた子プロセスでも last してるよね.

すると、全ての回答が全文表示されます。

関連するQ&A