perlのfork機能を使いたい者ですが、その挙動について質問しています。
ここ数日fork機能について勉強しましたが、
その挙動がどうでしても理解できないので、質問をさせていただいています。
質問内容を具体的にするため、以下に簡単なコードを書いておきます。
#!/usr/bin/perl
use strict;
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");
このコードをlinux上で起動させますと、下記の結果が得られました。
parent hello -> 0
parent finish
child hello -> 0
child exit -> 0
parent hello -> 1
parent finish
child hello -> 1
child exit -> 1
parent hello -> 2
parent finish
child hello -> 2
child exit -> 2
parent finish
ここから質問です。
上記の結果の中で自分が理解できないのは、
なぜ、「parent finish」が4回も出てくるのかということです。
自分の理解している部分では、「parent finish」はwhile loopの外にあるので、
「parent finish」をプリントするには、一度while loopを出る必要があると思います。
しかし、それが2、3回と続いてプリントされていることがなぜなのか理解できません。
理想としては、
parent hello -> 0
child hello -> 0
child exit -> 0
parent hello -> 1
child hello -> 1
child exit -> 1
parent hello -> 2
child hello -> 2
child exit -> 2
parent finish
という具合に、「parent finish」を一回だけ表示させたいのですが、それは可能でしょうか?
ご教授をお願いします。よろしくお願いします。
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
ありがとうございます。
確かにプロセス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"がプリントされていたのですね。
勉強にもなりましたし、大変スッキリしました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby プログラミング 3 2023/06/09 14:30
- 英語 コウノトリの孵化 5 2022/10/19 09:07
- C言語・C++・C# C言語について質問です。 以下のような結果を出すためにはどのようなコードが良いですか?サンプルコード 3 2022/11/01 16:19
- 英語 "Hello" の語源は何でしょうか?中国語の「好」Hǎo ではないでしょうか? 2 2022/04/01 10:23
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- Java マイクラでPythonのプログラミングができません 3 2023/05/28 07:15
- アプリ Android studio 初心者 Hello Android!しか表示されない 1 2023/08/01 08:47
- CM ANAのCMのナレーションがどなたなのか知りたいです。 1 2023/01/18 16:54
- その他(コンピューター・テクノロジー) Windows11の顔認証 3 2023/05/10 07:09
- JavaScript ifreamをリロードしたい 1 2022/05/03 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字のカラーとフォントの指定...
-
パイソンのクラスについて
-
foreach (1..4){ 英文字$_→$新...
-
【至急!!!】python言語で本を見...
-
Python3
-
<python>戻り値の使い方
-
数値英単語変換
-
pythonの*
-
Application.ScreenUpdating = ...
-
CLispのloop内の挙動について
-
どちのほうがすきですか?
-
セレクトメニューで選んだ値を...
-
【メモリ不足で落ちる(python)】
-
パイソンのクラスのブログラム
-
JSONで文字列が長い時
-
perlでcheckboxがうまく整理で...
-
パイソンのクラスについて
-
vscode 文字化け
-
右詰表示
-
ACCESS テキストボックスを隙...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
Pythonでターミナルに文字を出...
-
シェルスクリプトで、空白(ス...
-
【至急!!!】python言語で本を見...
-
pythonで演算子を変数に代入す...
-
c言語 16進数の2進数への変換
-
パイソンのクラスについて
-
I2C接続のLCDディスプレイを使う
-
関数「exists」と「defined」の...
-
pythonの*
-
変数の中は文字列か数値か調べ...
-
数値かどうかの判定方法
-
python print文のエラー
-
int(input("○○"))の使い方
-
Perlの例文でif($a==1&&$b==5&&...
-
Use of uninitialized value ---
-
awkの正規表現での最左最短マッ...
-
swift 文字コードから文字に変...
-
CGIでimgタグでalignを使うとエ...
-
javaのパッケージ構成で各パッ...
おすすめ情報