Perl ではさまざまな方法でプロセスを作成できます。
このチュートリアルでは、プロセスを管理するいくつかの方法について説明します。
特殊変数$$または$PROCESS_IDを使用してプロセス ID を取得できます。
%ENV ハッシュは、親プロセス (シェル) に環境変数を保存します。これらの変数は Perl で変更できます。
exit()は通常、子プロセスを終了するために使用されます。メイン プロセスは、すべての子プロセスが終了した後に終了します。
開いているすべてのハンドルはサブルーチンの dup() 関数によってコピーされ、プロセスによって閉じられたすべてのハンドルは他のプロセスに影響を与えません。
Unix コマンドは、バックティック演算子を使用して簡単に実行できます。バッククォートにいくつかの簡単なコマンドを挿入できます。コマンドが実行されると、結果が返されます。
#!/usr/bin/perl@files = `ls -l`;foreach $file (@files){ print $file;}1;
上記のプログラムを実行すると、出力結果は次のようになります。
drwxr-xr-x 3 ルート root 4096 9 月 14 日 06:46 9-14drwxr-xr-x 4 ルート root 4096 9 月 13 07:54 android-rw-r--r-- 1 ルート root 574 9 月 17 日 15:16 インデックス.htmdrwxr-xr-x 3 544 401 4096 7月6日 16:49 MIME-Lite-3.01-rw-r--r-- 1 root root 71 9月17日 15:16 test.pl……
system()関数を使用して Unix コマンドを実行することもでき、このコマンドを実行すると結果が直接出力されます。デフォルトでは、Perl の STDOUT が現在指している場所 (通常は画面) に送信されます。リダイレクト演算子 > を使用して、特定のファイルに出力することもできます。
上記のプログラムを実行すると、出力結果は次のようになります。
drwxr-xr-x 3 ルート root 4096 9 月 14 日 06:46 9-14drwxr-xr-x 4 ルート root 4096 9 月 13 07:54 android-rw-r--r-- 1 ルート root 574 9 月 17 日 15:16 インデックス.htmdrwxr-xr-x 3 544 401 4096 7月6日 16:49 MIME-Lite-3.01-rw-r--r-- 1 root root 71 9月17日 15:16 test.pl……
以下に示すように、$PATH や $HOME などの環境変数を含むコマンドの出力に注意する必要があります。
上記のプログラムを実行すると、出力結果は次のようになります。
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin私は Perl 変数です /usr/local/bin:/bin:/usr/bin:/ usr /local/sbin:/usr/sbin:/sbin
Perl fork() 関数は、新しいプロセスを作成するために使用されます。
親プロセスでは子プロセスの PID を返し、子プロセスでは 0 を返します。エラーが発生した場合 (メモリ不足など)、undef が返され、対応するエラー メッセージが $! に設定されます。
fork は exec と組み合わせて使用できます。 exec 関数が引用符で囲まれたコマンドを実行すると、プロセスは終了します。
上記のプログラムを実行すると、出力結果は次のようになります。
親プロセス経由で出力 子プロセス経由で出力 プロセス ID が 2016 年 6 月 19 日日曜日 22:21:14 CST に完了しました プロセス ID: 47117
プロセスが終了すると、親プロセスに CHLD シグナルが送信され、親プロセスは wait と waitpid を使用して終了する必要があります。もちろん、$SIG{CHLD} を IGNORG に設定することもできます。
上記のプログラムを実行すると、出力結果は次のようになります。
親プロセス経由で出力 子プロセス経由で出力 プロセス ID 2016 年 6 月 19 日 (日) 22:30:56 CST に完了 プロセス ID: -1
Perl kill('signal', (Process List)) はプロセスのグループにシグナルを送信します。 signal は送信されるデジタル信号、9 はプロセスを強制終了することを意味します。
まず、Linux で一般的に使用されるシグナルを見てみましょう。次のリストを参照してください。
信号名と値のアノテーションの説明—————————————————————————————————————————— ———HUP 1 A ハング検出 INT 2 A キーボードからの割り込み QUIT 3 A キーボードからの停止 ILL 4 A 不正な命令 ABRT 6 C 失敗 FPE 8 C 浮動小数点異常 KILL 9 AF 端子信号 USR1 10 A ユーザ定義信号 1SEGV 11 C不正なメモリ アクセス USR2 12 A ユーザー定義信号 2PIPE 13 A リーダーなしのパイプ ALRM への書き込み 14 A アラーム クロックからのタイマー信号 TERM 15 A 端末信号 CHLD 17 B 子プロセスの終了 CONT 18 E 停止した場合は STOP を続行 19 DF プロセスを停止TSTP 20 D tty で停止コマンド TTIN を入力します。 21 D バックグラウンド プロセスの tty で TTOU を入力します。 22 Dバックグラウンドプロセスへの tty 出力
次の例では、SIGINT シグナルをプロセス 104 と 102 に送信します。