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