Latest web development tutorials

Perlのプロセス管理

あなたがプロセスを作成するさまざまな方法でできるPerlの。

このチュートリアルでは、いくつかのプロセスの管理について説明します。

  • あなたは、プロセスIDを取得するために、特殊変数$$または$ PROCESS_IDを使用することができます

  • %ENVのハッシュはPerlでのシェル環境変数は、これらの変数を変更することができている親プロセスを、保持しています。

  • 出口が()通常、子プロセスを終了するために使用され、子プロセスはメインプロセスは、すべての後に終了します終了します。

  • すべての開いているハンドルはすべて、すべてのハンドルプロセスが他のプロセスには影響しません閉じコピーするサブルーチン()関数でDUPあります。


バックティック演算子

バッククォート演算子を使用すると、簡単にUnixのコマンドを実行することができます。 あなたは抗引用符でいくつかの簡単なコマンドを挿入することができます。 コマンドの実行結果を返します。

#!/usr/bin/perl

@files = `ls -l`;

foreach $file (@files){
   print $file;
}

1;

上記のプログラムは以下のように、出力結果は次のとおりです。

drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root  574 Sep 17 15:16 index.htm
drwxr-xr-x 3  544  401 4096 Jul  6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root   71 Sep 17 15:16 test.pl
……

システム()関数

また、コマンドは、出力を直接実行され、システム()関数は、Unixコマンドを実行し使用することができます。デフォルトでは、電流は標準画面で、PerlのSTDOUTポイントに送信されます。 また、指定したファイルにリダイレクト演算子>出力を使用することができます。

上記のプログラムは以下のように、出力結果は次のとおりです。

drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root  574 Sep 17 15:16 index.htm
drwxr-xr-x 3  544  401 4096 Jul  6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root   71 Sep 17 15:16 test.pl
……

次のようにコマンドを使用すると、このような出力または$ HOMEます$ PATHなどの環境変数を含める必要があることに注意してください。

#!/usr/bin/perl

$PATH = "我是 Perl 的变量";

system('echo $PATH');  # $PATH 作为 shell 环境变量
system("echo $PATH");  # $PATH 作为 Perl 的变量
system("echo \$PATH"); # 转义 $

1;

上記のプログラムは以下のように、出力結果は次のとおりです。

/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のフォーク()関数は、新しいプロセスを作成するために使用されます。

子プロセスが0を返すには、親プロセスのPIDで子を返します。 (例えば、メモリ不足)エラーがundefを返しますが発生した場合、および$!に対応するエラーメッセージが設定されます。

これは、フォークと幹部と一緒に使用することができます。 引用符で囲まれたコマンドの終了後に終了したexec関数の実行処理。

#!/usr/bin/perl

if(!defined($pid = fork())) {
   # fork 发生错误返回 undef
   die "无法创建子进程: $!";
}elsif ($pid == 0) {
   print "通过子进程输出\n";
   exec("date") || die "无法输出日期: $!";
  
} else {
   # 在父进程中
   print "通过父进程输出\n";
   $ret = waitpid($pid, 0);
   print "完成的进程ID: $ret\n";

}

1;

上記のプログラムは以下のように、出力結果は次のとおりです。

通过父进程输出
通过子进程输出
2016年 6月19日 星期日 22时21分14秒 CST
完成的进程ID: 47117

プロセスが終了した場合、それはCHLD後に親プロセスに信号を送り、それは、親プロセスの待機を必要とし、終了WAITPIDデッドプロセスになるであろう。 もちろん、あなたも$ SIG {CHLD} IGNORGに設定することができます。

#!/usr/bin/perl

local $SIG{CHLD} = "IGNORE";
 
if(!defined($pid = fork())) {
   # fork 发生错误返回 undef
   die "无法创建子进程: $!";
}elsif ($pid == 0) {
   print "通过子进程输出\n";
   exec("date") || die "无法输出日期: $!";
  
} else {
   # 在父进程中
   print "通过父进程输出\n";
   $ret = waitpid($pid, 0);
   print "完成的进程ID: $ret\n";

}

1;

上記のプログラムは以下のように、出力結果は次のとおりです。

通过父进程输出
通过子进程输出
2016年 6月19日 星期日 22时30分56秒 CST
完成的进程ID: -1

キル機能

Perlは((、 '信号'を殺すプロセスの一覧))プロセスのグループに信号を送ります。信号は、プロセスを殺すために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             用户定义的信号1
SEGV          11          C             非法内存访问
USR2          12          A             用户定义的信号2
PIPE           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を処理します。

#!/usr/bin/perl

kill('INT', 104, 102);
 
1;