Gestion des processus Perl


Vous pouvez créer des processus de différentes manières en Perl.

Ce tutoriel abordera certaines méthodes de gestion des processus.

  • Vous pouvez utiliser la variable spéciale $$ ou $PROCESS_ID pour obtenir l'ID du processus.

  • Le hachage %ENV stocke le processus parent, qui correspond aux variables d'environnement dans le shell. Ces variables peuvent être modifiées en Perl.

  • exit() est généralement utilisé pour quitter le processus enfant. Le processus principal se terminera une fois tous les processus enfants terminés.

  • Tous les handles ouverts seront copiés par la fonction dup() dans le sous-programme, et la fermeture de tous les handles du processus n'affectera pas les autres processus.


Opérateur Backtick

L'utilisation de l'opérateur backtick facilite l'exécution de commandes Unix. Vous pouvez insérer quelques commandes simples dans les backticks. Une fois la commande exécutée, le résultat sera renvoyé :

#!/usr/bin/perl

@files = `ls -l`;

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

1;

Exécutez le programme ci-dessus et le résultat de sortie sera le suivant :

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
……

fonction system()

Vous pouvez également utiliser system () La fonction exécute une commande Unix L'exécution de cette commande affichera directement le résultat. Par défaut, il sera envoyé à l'endroit où pointe actuellement STDOUT de Perl, qui est généralement l'écran. Vous pouvez également utiliser l'opérateur de redirection> pour sortir vers un fichier spécifié :

Exécutez le programme ci-dessus, le résultat de sortie est le suivant :

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
……

Vous devez noter que la commande contient des variables d'environnement. tel que $PATH ou $HOME Le résultat de sortie est le suivant :

#!/usr/bin/perl

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

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

1;

Exécutez le programme ci-dessus et le résultat de sortie est le suivant :

/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

fonction fork()

La fonction Perl fork() est utilisée pour créer un nouveau processus.

Renvoie le PID du processus enfant dans le processus parent et renvoie 0 dans le processus enfant. Si une erreur se produit (par exemple, mémoire insuffisante), undef est renvoyé et $! est défini sur le message d'erreur correspondant.

fork peut être utilisé avec exec. Le processus se termine une fois que la fonction exec exécute la commande entre guillemets.

#!/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;

Exécutez le programme ci-dessus, le résultat de sortie est le suivant :

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

Si le processus se termine, il enverra un signal CHLD au processus parent, et il deviendra un processus zombie, exigeant que le processus parent utilise wait et waitpid pour se terminer. Bien sûr, vous pouvez également définir $SIG{CHLD} sur 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;

Exécutez le programme ci-dessus, le résultat de sortie est le suivant :

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

Fonction Kill

Perl kill('signal', (Process List))Envoie un signal à un groupe de processus. Le signal est le signal numérique envoyé, 9 consiste à tuer le processus.

Tout d'abord, jetons un coup d'œil aux signaux couramment utilisés sous Linux, voir la liste suivante :

信号名          值          标注          解释
————————————————————————————————————————————————————————————
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输出

Les exemples suivants envoient des signaux SIGINT aux processus 104 et 102 :

#!/usr/bin/perl

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