Perl のフォーク関数

Perl Nofoku Guan Shu



fork() は Perl の組み込み関数で、実行中のプロセスの子プロセスを作成するために使用され、Linux オペレーティング システムでのみ動作します。実行プロセスの別のコピーを作成し、両方のプロセスを並行して実行します。したがって、親プロセスの変数が更新されても、子プロセスの同じ変数には影響しません。またその逆も同様です。このチュートリアルでは、Perl での fork() 関数の使用法を示します。

構文:

fork() 関数の構文を以下に示します。数値または「undef」を返します。 fork() 関数が正常に動作すると、特定のプロセス ID が返されるか、子プロセスに対して 0 が返されます。 fork() 関数が失敗した場合は、「undef」を返します。







ID または アンデフフォーク ( ) ;

例 1: Fork() 関数の簡単な使用法

fork() 関数を使用して現在のプロセスから子プロセスを作成する次のスクリプトを含む Perl ファイルを作成します。プロセス ID は、fork() 関数の実行後に出力されます。親プロセスと子プロセスの変数は、異なるメモリ場所に保存されます。したがって、親プロセスで変数の値が変更された場合、子プロセスの同じ変数は変更されません。またその逆も同様です。このスクリプトでは、親プロセスの変数を変更します。次に、親プロセスと子プロセスの両方の変数が出力されます。



#!/usr/bin/perl

厳密に使用する ;
使用 警告 ;
5.34.0を使用してください ;

#変数を宣言する
私の$var = 「テストフォーク」 ;
#現在のプロセスをフォークする
私の $process_id = フォーク ( ) ;

#プロセスIDを確認する
もし ( $プロセスID < 0 )
{
言う 「プロセスをフォークできません。」 ;
}
エルシフ ( $プロセスID == 0 )
{
言う 「子プロセス:」 ;
#子プロセスの変数の値を出力する
言う 「変数の値: $var」 ;
}
それ以外
{
言う 「親プロセス: $process_id」 ;
#変数の値を更新する
$var = 「テストフォーク2」 ;
#親プロセスの変数の値を出力する
言う 「変数の値: $var」 ;
}

出力:



スクリプトを実行すると、次の出力が表示されます。親プロセスの変数は「Test Fork 2」の値で変更されますが、子プロセスの変数は変更されません。したがって、子プロセスの変数の値は「Test Fork」になります。それがフォーク後の値です。





  p1

例 2: Fork() 関数と Wait() 関数の使用

fork() 関数と wait() 関数の使用を示す次のスクリプトを含む Perl ファイルを作成します。スクリプトの先頭で 3 つの変数が宣言されます。 sleep() 関数は、親プロセスのブロック内で 1 秒間、子プロセス内で 2 秒間使用されます。 2 つの変数の合計が計算され、親プロセスのブロック内の別の変数に保存されます。 2 つの変数の値が乗算され、子プロセス内の別の変数に格納されます。 wait() 関数は、スクリプトの最後で使用され、あるプロセスのタスクが完了するのを待ってから、別のプロセスのタスクを開始します。スクリプト内で fork() 関数が複数回使用され、多くのプロセスが同時に実行されている場合、デッドロック状況が発生する可能性があります。この問題は、wait() 関数を使用して解決できます。



#!/usr/bin/perl

厳密に使用する ;
使用 警告 ;
5.34.0を使用してください ;

#変数を初期化する
私の$n1 = 10 ;
私の$n2 = 25 ;
私の $result = 0 ;

#現在のプロセスをフォークする
私の $process_id = フォーク ( ) ;

#プロセスIDを確認する
もし ( $プロセスID == 0 )
{
#数値の乗算を計算する
言う 「子プロセス: $$」 ;
$結果 = $n1 * $n2 ;
言う 「2秒ほど待ってください… \n ;
寝る 2 ;
言う 「$n1 と $n2 の乗算は $result です。」 ;
}
エルシフ ( $プロセスID > 0 )
{
#数値の合計を計算する
言う 「親プロセス: $$」 ;
$結果 = $n1 + $n2 ;
言う 「1秒待ってください… \n ;
寝る 1 ;
言う 「$n1 と $n2 の合計が $result です。」 ;
}
それ以外
{
言う 「プロセスをフォークできません。」 ;
}

#プロセスタスクが完了するまで待ちます
待って ( ) ;

出力:

スクリプトを実行すると、次の出力が表示されます。出力によると、子プロセスが正常に作成され、親プロセスのプロセス ID が出力され、タスクを完了するためにスクリプトが 1 秒間一時停止されます。次に、子プロセスのプロセス ID が出力され、タスクを完了するためにスクリプトが 2 秒間一時停止されます。親プロセスと子プロセスの両方の出力が後で出力されます。

  p2

結論

このチュートリアルでは、子プロセスを作成し、親プロセスと子プロセスのブロック内でさまざまなタイプのタスクを実行することによって、Perl fork() 関数を使用する目的を示します。