Perl - Prozessmanagement
Sie können Perl auf verschiedene Arten verwenden, um neue Prozesse gemäß Ihren Anforderungen zu erstellen. In diesem Tutorial werden einige wichtige und am häufigsten verwendete Methoden zum Erstellen und Verwalten von Perl-Prozessen aufgeführt.
Sie können spezielle Variablen verwenden $$ oder $PROCESS_ID um die aktuelle Prozess-ID abzurufen.
Jeder Prozess, der mit einer der genannten Methoden erstellt wurde, verwaltet seine eigene virtuelle Umgebung mit In %ENV Variable.
Das exit() Die Funktion beendet immer nur den untergeordneten Prozess, der diese Funktion ausführt, und der Hauptprozess als Ganzes wird erst beendet, wenn alle laufenden untergeordneten Prozesse beendet wurden.
Alle geöffneten Handles werden in untergeordneten Prozessen mit dup () versehen, sodass das Schließen von Handles in einem Prozess keine Auswirkungen auf die anderen hat.
Backstick-Bediener
Diese einfachste Art, einen Unix-Befehl auszuführen, ist die Verwendung des Backstick-Operators. Sie geben Ihren Befehl einfach in den Backstick-Operator ein, wodurch der Befehl ausgeführt wird und das Ergebnis zurückgegeben wird, das wie folgt gespeichert werden kann:
#!/usr/bin/perl
@files = `ls -l`;
foreach $file (@files) {
print $file;
}
1;
Wenn der obige Code ausgeführt wird, werden alle im aktuellen Verzeichnis verfügbaren Dateien und Verzeichnisse aufgelistet.
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
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
Die system () Funktion
Sie können auch verwenden system()Funktion zum Ausführen eines Unix-Befehls, dessen Ausgabe an die Ausgabe des Perl-Skripts geht. Standardmäßig ist dies der Bildschirm, dh STDOUT, aber Sie können ihn mit dem Umleitungsoperator> - in eine beliebige Datei umleiten
#!/usr/bin/perl
system( "ls -l")
1;
Wenn der obige Code ausgeführt wird, werden alle im aktuellen Verzeichnis verfügbaren Dateien und Verzeichnisse aufgelistet.
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
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
Seien Sie vorsichtig, wenn Ihr Befehl Shell-Umgebungsvariablen wie $ PATH oder $ HOME enthält. Versuchen Sie die folgenden drei Szenarien:
#!/usr/bin/perl
$PATH = "I am Perl Variable";
system('echo $PATH'); # Treats $PATH as shell variable
system("echo $PATH"); # Treats $PATH as Perl variable
system("echo \$PATH"); # Escaping $ works.
1;
Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt, abhängig davon, was in der Shell-Variablen $ PATH festgelegt ist.
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
I am Perl Variable
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
Die fork () Funktion
Perl bietet eine fork()Funktion, die dem gleichnamigen Unix-Systemaufruf entspricht. Auf den meisten Unix-ähnlichen Plattformen, auf denen der Systemaufruf fork () verfügbar ist, ruft Perls fork () ihn einfach auf. Auf einigen Plattformen wie Windows, auf denen der Systemaufruf fork () nicht verfügbar ist, kann Perl so erstellt werden, dass fork () auf Interpreterebene emuliert wird.
Die Funktion fork () wird verwendet, um einen aktuellen Prozess zu klonen. Dieser Aufruf erstellt einen neuen Prozess, in dem dasselbe Programm am selben Punkt ausgeführt wird. Es gibt die untergeordnete PID an den übergeordneten Prozess zurück, 0 an den untergeordneten Prozess oder undef, wenn der Fork nicht erfolgreich ist.
Sie können verwenden exec() Funktion innerhalb eines Prozesses zum Starten der angeforderten ausführbaren Datei, die in einem separaten Prozessbereich ausgeführt wird und exec () wartet, bis sie abgeschlossen ist, bevor sie mit demselben Beendigungsstatus wie dieser Prozess beendet wird.
#!/usr/bin/perl
if(!defined($pid = fork())) {
# fork returned undef, so unsuccessful
die "Cannot fork a child: $!";
} elsif ($pid == 0) {
print "Printed by child process\n";
exec("date") || die "can't exec date: $!";
} else {
# fork returned 0 nor undef
# so this branch is parent
print "Printed by parent process\n";
$ret = waitpid($pid, 0);
print "Completed process id: $ret\n";
}
1;
Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:
Printed by parent process
Printed by child process
Tue Sep 17 15:41:08 CDT 2013
Completed process id: 17777
Das wait() und waitpid()kann als Pseudoprozess-ID übergeben werden, die von fork () zurückgegeben wird. Diese Aufrufe warten ordnungsgemäß auf die Beendigung des Pseudoprozesses und geben seinen Status zurück. Wenn Sie gabeln, ohne jemals auf Ihre Kinder zu wartenwaitpid()Funktion, werden Sie Zombies ansammeln. Auf Unix-Systemen können Sie dies vermeiden, indem Sie $ SIG {CHLD} wie folgt auf "IGNORE" setzen -
#!/usr/bin/perl
local $SIG{CHLD} = "IGNORE";
if(!defined($pid = fork())) {
# fork returned undef, so unsuccessful
die "Cannot fork a child: $!";
} elsif ($pid == 0) {
print "Printed by child process\n";
exec("date") || die "can't exec date: $!";
} else {
# fork returned 0 nor undef
# so this branch is parent
print "Printed by parent process\n";
$ret = waitpid($pid, 0);
print "Completed process id: $ret\n";
}
1;
Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:
Printed by parent process
Printed by child process
Tue Sep 17 15:44:07 CDT 2013
Completed process id: -1
Die Funktion kill ()
Perl kill('KILL', (Process List)) Die Funktion kann verwendet werden, um einen Pseudoprozess zu beenden, indem ihm die von fork () zurückgegebene ID übergeben wird.
Beachten Sie, dass die Verwendung von kill ('KILL', (Prozessliste)) für einen Pseudoprozess () normalerweise zu Speicherverlusten führen kann, da der Thread, der den Pseudoprozess implementiert, keine Chance erhält, seine Ressourcen zu bereinigen.
Sie können verwenden kill() Die Funktion zum Senden eines anderen Signals an Zielprozesse, z. B. das folgende, sendet SIGINT an die Prozess-IDs 104 und 102 -
#!/usr/bin/perl
kill('INT', 104, 102);
1;