system PROGRAMMA LISTA
Fa esattamente la stessa cosa di exec LISTA, salvo che viene eseguito prima un fork e che il
processo genitore aspetta che il processo figlio abbia ultimato. Va notato che il trattamento
degli argomenti varia in relazione al numero di argomenti. Se c'è più di un
argomento nella LISTA oppure se la LISTA è un array con più di un valore, fa
partire il programma fornendo il primo elemento della lista con argomenti forniti dal resto
della lista. Se c'è solo un argomento scalare, l'argomento viene esaminato alla ricerca
di metacaratteri di shell e, se presenti, l'intero argomento viene passato alla shell dei
comandi del sistema per l'analisi sintattica (questa è /bin/sh -c su piattaforme
Unix ma può variare su altre piattaforme). Se nell'argomento non ci sono metacaratteri
di shell, esso viene diviso in parole e passato direttamente a execvp che è
più efficiente.
A partire dalla versione 5.6.0, il Perl cerca di terminare le operazioni di I/O in corso su
tutti i file aperti per l'output prima di ogni operazione che potrebbe eseguire un fork, ma
questo potrebbe non essere supportato su alcune piattaforme (consultate perlport). Per essere
sicuri, dovreste impostare $| ($AUTOFLUSH nel modulo English) oppure chiamare il metodo
autoflush() di IO::Handle su ogni handle aperto.
Il valore restituito è lo stato di uscita del programma come restituito dalla chiamata
wait. Per ottenere il valore di uscita corrente, fate uno shift a destra di otto (guardate
di seguito). Consultate anche exec. Questo non è quello che avete bisogno di
usare per catturare l'output da un comando, per questo dovreste usare soltanto le
virgolette inverse oppure qx// come descritto in perlop/"`STRING`". Un valore restituito
pari a -1 indica un insuccesso nel far eseguire il programma oppure un errore della chiamata di
sistema wait(2) (esaminate $! per il motivo).
Come exec, system permette di mentire ad un programma riguardo al proprio nome se si usa
la sintassi system PROGRAMMA LISTA. Di nuovo, si veda exec.
Dato che system e le virgolette inverse bloccano SIGINT e SIGQUIT, eseguire un
kill sul programma che essi stanno eseguendo non interromperà realmente il
programma.
Visto che SIGINT e SIGQUIT vengono ignorati durante l'esecuzione di system,
se vi aspettate che il vostro programma termini sulla ricezione di questi segnali,
avrete bisogno di fare in modo di farlo voi stessi, in base al valore restituito.
@args = ("comando", "arg1", "arg2");
system(@args) == 0
or die "system @args e` fallito: $?"
Potete controllare tutte le possibilità di insuccesso, ispezionando $? come in
questo caso:
if ($? == -1) {
print "fallimento nell'esecuzione: $!\n";
}
elsif ($? & 127) {
printf "figlio morto con segnale %d, %s coredump\n",
($? & 127), ($? & 128) ? 'con' : 'senza';
}
else {
printf "figlio uscito con valore %d\n", $? >> 8;
}
oppure in maniera più portabile usando le chiamate W*() dell'estensione POSIX; si
veda perlport per maggiori informazioni.
Quando gli argomenti vengono fatti eseguire mediante la shell di sistema, i risultati e i
codici che vengono restituiti saranno soggetti ai suoi vezzi e proprietà. Consultate
perlop/"`STRING`" e exec per i dettagli.