Perl-Prozessverwaltung

In Perl können Sie Prozesse auf verschiedene Weise erstellen.

Dieses Tutorial behandelt einige Methoden der Prozessverwaltung.

  • Sie können die spezielle Variable$$oder$PROCESS_IDverwenden, um die Prozess-ID zu erhalten.

  • Der %ENV-Hash speichert die Umgebungsvariablen des Elternprozesses, also die Umgebungsvariablen in der Shell. Diese Variablen können in Perl geändert werden.

  • exit()Wird üblicherweise verwendet, um Kindprozesse zu beenden; der Hauptprozess beendet sich, nachdem alle Kindprozesse beendet wurden.

  • Alle offenen Handles werden im Kindprozess über die Funktion dup() dupliziert, und das Schließen beliebiger Handles in einem Prozess wirkt sich nicht auf andere Prozesse aus.


Backtick-Operator

Mit dem Backtick-Operator können Sie ganz einfach Unix-Befehle ausführen. Sie können einige einfache Befehle in Backticks einfügen. Nachdem der Befehl ausgeführt wurde, wird das Ergebnis zurückgegeben:

#!/usr/bin/perl

@files = `ls -l`;

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

1;

Führen Sie das obige Programm aus; die Ausgabe sieht wie folgt aus:

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

system()-Funktion

Sie können auch diesystem()-Funktion verwenden, um Unix-Befehle auszuführen. Beim Ausführen des Befehls wird das Ergebnis direkt ausgegeben. Standardmäßig wird es dorthin gesendet, wohin Perls STDOUT aktuell zeigt, normalerweise auf den Bildschirm. Sie können auch den Umleitungsoperator > verwenden, um in eine angegebene Datei auszugeben:

Führen Sie das obige Programm aus; die Ausgabe sieht wie folgt aus:

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

Sie müssen auf die Ausgabeergebnisse achten, wenn Befehle Umgebungsvariablen wie $PATH oder $HOME enthalten, wie unten gezeigt:

Beispiel

#!/usr/bin/perl $PATH = "Ich bin eine Perl-Variable"; system('echo $PATH'); # $PATH als Shell-Umgebungsvariable system("echo $PATH"); # $PATH als Perl-Variable system("echo \$PATH"); # $ escapen 1;

Führen Sie das obige Programm aus; die Ausgabe sieht wie folgt aus:

/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

fork()-Funktion

Perls fork()-Funktion wird verwendet, um einen neuen Prozess zu erzeugen.

Im Elternprozess gibt sie die PID des Kindprozesses zurück; im Kindprozess gibt sie 0 zurück. Wenn ein Fehler auftritt (z. B. unzureichender Speicher), gibt sie undef zurück und setzt $! auf die entsprechende Fehlermeldung.

fork kann zusammen mit exec verwendet werden. Die exec-Funktion beendet den Prozess, nachdem sie den Befehl in den Anführungszeichen ausgeführt hat.

Beispiel

#!/usr/bin/perl if(!defined($pid = fork())) { # fork gibt bei einem Fehler undef zurück die "Kindprozess kann nicht erstellt werden:$!"; }elsif ($pid == 0) { print "Ausgabe vom Kindprozess\n"; exec("date") || die "Datum kann nicht ausgegeben werden:$!"; } else { # Im Elternprozess print "Ausgabe vom Elternprozess\n"; $ret = waitpid($pid, 0); print "Abgeschlossene Prozess-ID:$ret\n"; } 1;

Führen Sie das obige Programm aus; die Ausgabe sieht wie folgt aus:

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

Wenn ein Prozess endet, sendet er ein CHLD-Signal an den Elternprozess und wird dann zu einem Zombieprozess. Der Elternprozess muss wait und waitpid verwenden, um ihn zu beenden. Natürlich können Sie $SIG{CHLD} auch auf IGNORE setzen:

Beispiel

#!/usr/bin/perl local $SIG{CHLD} = "IGNORE"; if(!defined($pid = fork())) { # fork gibt im Fehlerfall undef zurück die "Kindprozess kann nicht erstellt werden:$!"; }elsif ($pid == 0) { print "Ausgabe vom Kindprozess\n"; exec("date") || die "Datum kann nicht ausgegeben werden:$!"; } else { # Im Elternprozess print "Ausgabe vom Elternprozess\n"; $ret = waitpid($pid, 0); print "Abgeschlossene Prozess-ID:$ret\n"; } 1;

Führen Sie das obige Programm aus; die Ausgabe sieht wie folgt aus:

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

Kill-Funktion

Perl kill('signal', (Process List))Sendet ein Signal an eine Gruppe von Prozessen. signal ist das zu sendende numerische Signal; 9 beendet den Prozess.

Schauen wir uns zunächst die gängigen Signale unter Linux an, wie in der folgenden Liste dargestellt:

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

Das folgende Beispiel sendet das SIGINT-Signal an die Prozesse 104 und 102:

Beispiel

#!/usr/bin/perl kill('INT', 104, 102); 1;
Weitere Erweiterungen