2013-01-07 14 views
8

Ich möchte einen untergeordneten Prozess in Perl ausführen. Ich möchte auch, dass mein Code plattformunabhängig ist (für Windows genauso wie für Unix, außer einigen Fehlern wie Dateipfad usw.).Fork-Implementierung in Perl

Das Problem ist Perl-Implementierung von Fork in Windows, ist ein Pseudoprozess, eigentlich ein Thread. Bitte beachten Sie die Perl Fork Emulation für Windows here.

Es erwähnt auch Probleme bei der Ausführung kill und exec Befehle auf Pseudoprozessen. Wäre es sicher, zwei verschiedene Versionen von fork für verschiedene Plattformen zu verwenden oder sollte ich OS-spezifische APIs verwenden?

Antwort

4

Angenommen, Sie benötigen asynchrone Prozesse, gehen Sie zu den plattformspezifischen APIs (wenn Sie auf das Kind warten können, können Sie system oder qx verwenden).

Das ist fork/exec unter UNIX, Win32::Process::Create unter Windows. Die Fork-Emulation unter Windows war ein mutiger Versuch, aber die Plattformen sind in diesem Bereich so unterschiedlich. Ich denke, Sie sind auf der Suche nach einer tragbaren Lösung, die alle Anforderungen erfüllt.

Beispiel: Python versuchte, die Schnittstellen mit ihrem subprocess-Modul zu vereinheitlichen. Es funktioniert für einfache Sachen, aber es gibt 4 UNIX spezifische und 2 Windows spezifische Parameter (zu Popen).

5

Forks::Super sorgt bereits über und richtet sich viele dieser Portabilität Bedenken, so dass Sie portably Code wie

use Forks::Super; 

$pid = fork(); 
if ($pid != 0) { 
    ... 
    if (kill 'ZERO',$pid) { print "Job is running.\n"; } 
    kill 'STOP', $pid; # or $pid->suspend 
    kill 'CONT', $pid; # or $pid->resume 
    kill 'TERM', $pid; # or $pid->terminate 
    waitpid $pid, 0; # or $pid->wait or $pid->waitpid(0) 
} 
laufen