2013-01-07 14 views
8

Voglio eseguire un processo figlio in perl. Voglio anche che il mio codice sia indipendente dalla piattaforma (lo stesso per Windows e Unix, ad eccezione di alcuni problemi come il percorso file ecc.).implementazione della forcella in perl

Il problema è l'implementazione perl di fork in windows, è uno pseudo-processo, in realtà un thread. Fare riferimento all'emulazione della forcella perl per windows here.

Si parla inoltre dei problemi relativi all'esecuzione dei comandi kill e exec su pseudo-processi. Sarebbe sicuro usare due diverse versioni di fork per piattaforme diverse o dovrei andare con API specifiche per OS?

risposta

4

Supponendo che si richiedano processi asincroni, andare per le API specifiche della piattaforma (se si può attendere il figlio, è possibile utilizzare system o qx).

Questo è fork/exec su UNIX, Win32::Process::Create su Windows. L'emulazione di fork su Windows è stata una prova coraggiosa, ma le piattaforme sono così diverse in quest'area penso che tu sia più flessibile cercando di produrre una soluzione portatile che tocchi tutte le scatole.

Esempio: python ha provato a unificare le interfacce con il loro modulo subprocess. Funziona per cose semplici, ma ci sono 4 parametri specifici per UNIX e 2 per Windows (per Popen).

5

Forks::Super preoccupa già circa e rivolge un sacco di queste preoccupazioni di portabilità, consentendo di eseguire codice come portabile

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) 
}