indietro

  • system LISTA
  • 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.