6.1.5 Gestione dei processi

Queste funzioni possono venire usate per creare e gestire i processi.

Le diverse funzioni exec*() prendono in input una lista di argomenti, che vengono passati al programma caricato nel nuovo processo. In ciascun caso, il primo di questi argomenti passati al programma è il nome del programma stesso, piuttosto che un argomento digitato dall'utente sulla riga di comando. Per i programmatori in C, questo è il corrispondente dell'argomento argv[0] passato alla funzione main() di un programma. Per esempio, "os.execv('/bin/echo', ['foo', 'bar'])" stamperà solamente "bar" sullo standard output; "foo" verrà apparentemente ignorato.

abort( )
Genera un segnale SIGABRT per il processo corrente. In Unix, il comportamento predefinito è quello di produrre un ``core dump''; in Windows, il processo termina immediatamente restituendo un codice di uscita uguale a 3. Fatte attenzione al fatto che i programmi che usano signal.signal() per registrare una funzione di gestione del segnale SIGABRT, si comporteranno diversamente. Disponibilità: Unix, Windows.

execl( path, arg0, arg1, ...)
execle( path, arg0, arg1, ..., env)
execlp( file, arg0, arg1, ...)
execlpe( file, arg0, arg1, ..., env)
execv( path, args)
execve( path, args, env)
execvp( file, args)
execvpe( file, args, env)
Queste funzioni eseguono tutte un nuovo programma, rimpiazzando il processo corrente; pertanto esse non restituiscono mai il controllo al chiamante. In Unix, il nuovo eseguibile viene caricato nel processo corrente, e avrà lo stesso identificativo del processo in cui viene eseguita la chiamata. Eventuali errori verranno riportati come eccezioni OSError.

Le varianti "l" e "v" delle funzioni exec*() si differenziano per il modo in cui i parametri sulla riga di comando vengono passati. Le varianti "l" sono forse le più facili con cui lavorare se il numero di parametri non varia una volta scritto il codice; i singoli parametri semplicemente diventano argomenti addizionali delle funzioni execl*(). Le varianti "v" sono utili quando il numero di parametri è variabile, dato che vengono passati come lista o tupla, corrispondente all'argomento args. In ogni caso, i parametri sulla riga di comando per il processo figlio devono iniziare con il nome del comando che si sta per eseguire.

Le varianti che includono una "p" verso la fine del nome (execlp(), execlpe(), execvp() e execvpe()) faranno uso della variabile di ambiente PATH per localizzare il programma file. Quando le variabili di ambiente vengono sostituite (usando una delle varianti exec*e() discusse nel prossimo paragrafo), il nuovo ambiente viene utilizzato come sorgente per la variabile PATH. Le altre varianti, execl(), execle(), execv() ed execve() non faranno uso della variabile di ambiente PATH per localizzare l'eseguibile; in questo caso l'argomento path deve contenere un percorso appropriato, relativo o assoluto, per arrivare ad esso.

Per execle(), execlpe(), execve() e execvpe() (notate come tutte abbiano un nome che termina per "e"), l'argomento env deve essere un oggetto di tipo mappa, usato per definire le variabili di ambiente per il nuovo processo; le funzioni execl(), execlp(), execv() e execvp() fanno tutte in modo che il nuovo processo erediti l'ambiente del processo corrente. Disponibilità: Unix, Windows.

_exit( n)
Termina immediatamente il programma con un codice di uscita pari a n, senza chiamare prima funzioni di pulizia finale, senza scaricare i buffer di 'stdio', o altro. Disponibilità: Unix, Windows.

Note: Il modo standard di terminare un programma è sys.exit(n). _exit() dovrebbe venire usata normalmente solo da processi figli creati da fork().

Vengono definiti i seguenti codici di uscita utilizzabili con _exit(), sebbene non richiesti. Questi codici vengono di solito usati per programmi di sistema scritti in Python, come ad esempio un server di posta che per la consegna dei messaggi.

EX_OK
Codice di uscita indicante che non è stato rilevato nessun errore. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_USAGE
Codice di uscita indicante che il comando non è stato usato in modo corretto, come quando viene passato un numero errato di argomenti. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_DATAERR
Codice di uscita indicante che i dati in input erano errati. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_NOINPUT
Codice di uscita indicante che un file di input non esisteva o non era leggibile. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_NOUSER
Codice di uscita indicante che un utente specificato non esisteva. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_NOHOST
Codice di uscita indicante che un host specificato non esisteva. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_UNAVAILABLE
Codice di uscita indicante che un servizio richiesto non è disponbile. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_SOFTWARE
Codice di uscita indicante che è stato individuato un errore interno del software. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_OSERR
Codice di uscita indicante che è stato individuato un errore di sistema operativo, come ad esempio l'impossibilità di eseguire l'operazione di 'fork' o di creare una 'pipe'. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_OSFILE
Codice di uscita indicante che uno o più file di sistem non esistevano, non è stato possibile aprirli, o simili condizioni di errore. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_CANTCREAT
Codice di uscita indicante che non è stato possibile creare un file di output specificato dall'utente. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_IOERR
Codice di uscita indicante che si è verificato un errore durante l'esecuzione di operazioni I/O su qualche file. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_TEMPFAIL
Codice di uscita indicante che si è verificato un errore di tipo temporaneo. Questo codice indica il verificarsi di condizioni che potrebbero non essere degli errori, come l'impossibilità di effettuare una connessione di rete durante un'operazione che può comunque venire tentata di nuovo. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_PROTOCOL
Codice di uscita indicante che un protocollo di comunicazione era non permesso, non valido o comunque non comprensibile. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_NOPERM
Codice di uscita indicante che non vi erano i permessi necessari per eseguire l'operazione (ma questo non indica problemi sul file system). Disponibilità: Unix. Nuovo nella versione 2.3.

EX_CONFIG
Codice di uscita indicante che si è verificato un qualche errore di configurazione. Disponibilità: Unix. Nuovo nella versione 2.3.

EX_NOTFOUND
Codice di uscita indicante condizioni del tipo ``elemento non trovato''. Disponibilità: Unix. Nuovo nella versione 2.3.

fork( )
Sdoppia il processo corrente, creando un processo figlioi (NdT: fork). Restituisce 0 nel flusso di controllo del processo figlio, mentre in quello del processo padre restituisce l'identificativo del processo figlio. Disponibilità: Unix.

forkpty( )
Crea un processo figlio, usando un nuovo pseudo terminale come suo terminale di controllo. Restituisce una coppia del tipo (pid, fd), dove pid vale 0 nel processo figlio ed è uguale all'identificativo del processo figlio nel processo padre, mentre fd è il descrittore di file della terminazione master dello pseudo terminale. Per un approccio più portabile, usate il modulo pty. Disponibilità: alcune varianti di Unix.

kill( pid, sig)
Uccide il processo pid mediante il segnale sig. Nel modulo signal vengono definite delle costanti che rappresentano i segnali disponibili sul sistema ospite. Disponibilità: Unix.

killpg( pgid, sig)
Uccide il gruppo pgid mediante il segnale sig. Disponibilità: Unix. Nuovo nella versione 2.3.

nice( increment)
Aggiunge il valore di increment al valore ``nice'' del processo. Restituisce il nuovo valore di ``nice''. Disponibilità: Unix.

plock( op)
Blocca in memoria alcuni segmenti del programma. Il valore di op (definito in <sys/lock.h>) determina quali segmenti vengono bloccati. Disponibilità: Unix.

popen( ...)
popen2( ...)
popen3( ...)
popen4( ...)
Esegue dei processi figli, restituendo delle pipe aperte che servono per comunicare con essi. Queste funzioni vengono descritte nella sezione 6.1.2.

spawnl( mode, path, ...)
spawnle( mode, path, ..., env)
spawnlp( mode, file, ...)
spawnlpe( mode, file, ..., env)
spawnv( mode, path, args)
spawnve( mode, path, args, env)
spawnvp( mode, file, args)
spawnvpe( mode, file, args, env)
Esegue il programma indicato da path in un nuovo processo. Se l'argomento mode vale P_NOWAIT, questa funzione restituisce l'identificativo del nuovo processo; se mode vale P_WAIT, restituisce il codice di uscita del processo se questo termina normalmente, oppure -signal, dove signal indica il segnale che ha ucciso il processo. In windows, l'identificativo del processo sarà in effetti l'handle dello stesso, in modo da poter venire usato con la funzione waitpid().

Le varianti "l" e "v" della funzione spawn*() si differenziano nel modo in cui vengono passati i parametri da linea di comando vengono passati. Le varianti "l" sono forse le più facili con le quli lavorare se il numero di parametri viene fissato, una volta scritto il codice; i parametri individuali semplicemente diventano parametri aggiuntivi delle funzioni spawnl*(). Le varianti "v" sono adatte quando il numero dei parametri è variabile, dato che essi vengono passati come lista o tupla corrispondente all'argomento args. In entrambi i casi, gli argomenti del processo figlio devono cominciare con il nome del programma che tale processo sta per eseguire.

Le varianti che includono una seconda "p" verso la fine del nome (spawnlp(), spawnlpe(), spawnvp() e spawnvpe()) useranno la variabile di ambiente PATH per localizzare il programma file. Quando le variabili di ambiente vengono sostituite (usando una delle varianti spawn*e() discusse nel prossimo paragrafo), il nuovo ambiente viene utilizzato come sorgente della nuova variabile PATH. Le altre varianti, spawnl(), spawnle(), spawnv() e spawnve(), non useranno la variabile PATH per localizzare l'eseguibile; path deve contenere un percorso appropriato, assoluto o relativo.

Per quanto riguarda le funzioni spawnle(), spawnlpe(), spawnve(), e spawnvpe() (notate che tutte hanno nomi che terminano in "e"), l'argomento env deve essere un oggetto di tipo mappa usato per definire le variabili di ambiente per il nuovo processo; le funzioni spawnl(), spawnlp(), spawnv() e spawnvp() fanno tutte in modo che il nuovo processo erediti l'ambiente del processo corrente.

Come esempio, considerate come le seguenti chiamate a spawnlp() e spawnvpe() siano equivalenti.

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')

L = ['cp', 'index.html', '/dev/null']
os.spawnvpe(os.P_WAIT, 'cp', L, os.environ)

Disponibilità: Unix, Windows. spawnlp(), spawnlpe(), spawnvp() and spawnvpe() non sono disponibili in Windows. Nuovo nella versione 1.6.

P_NOWAIT
P_NOWAITO
Possibili valori per il parametro mode della famiglia di funzioni spawn*(). Se viene passato uno di questi valori, le funzioni di tipo spawn*() terminano non appena il nuovo processo viene creato, usando l'identificativo del nuovo processo come valore restituito. Disponibilità: Unix, Windows. Nuovo nella versione 1.6.

P_WAIT
Possibile valore per il parametro mode della famiglia di funzioni spawn*(). Se viene passato questo valore come mode, le funzioni di tipo spawn*() non termineranno fino a che il nuovo processo non sia terminato, e restituiranno come valore di ritorno il codice di uscita del processo, se è stato possibile eseguirlo con successo, oppure -signal, se un segnale ha ucciso il processo. Disponibilità: Unix, Windows. Nuovo nella versione 1.6.

P_DETACH
P_OVERLAY
Possibili valori per il parametro mode della famiglia funzioni spawn*(). Questi valori sono meno portabili rispetto a quelli precedentemente elencati. P_DETACH è simile a P_NOWAIT, ma il nuovo processo viene staccato dalla console del processo padre. Se viene usato P_OVERLAY, il processo corrente viene rimpiazzato dal nuovo processo; in questo caso la funzione spawn*() non restituirà mai il controllo. Disponibilità: Windows. Nuovo nella versione 1.6.

startfile( path)
Avvia un file mediante l'applicazione ad essa associata. L'effetto è lo stesso che fare un doppio click sul file in Windows Explorer, o passare il nome del file al comando di start dalla shell interattiva: il file viene aperto con qualsiasi applicazione (se esiste) associata all'estensione del file.

startfile() restituisce il controllo non appena l'applicazione associata viene lanciata. Non ci sono opzioni per attendere che l'applicazione si chiuda, e non c'è modo di recuperare il valore di uscita della funzione. Il parametro path è relativo alla directory corrente. Se volete usare un percorso assoluto, assicuratevi che il primo carattere non sia uno slash ("/"); la sottostante funzione Win32 ShellExecute() non funzionerebbe in questo caso. Usate la funzione os.path.normpath() per assicurarvi che il percorso venga codificato correttamente per Win32. Disponibilità: Windows. Nuovo nella versione 2.0.

system( command)
Esegue il comando command (una stringa) in una shell di comandi eseguita da un sotto processo. Questa funzione viene implementata usando la funzione system() dello Standard C, e ha le sue stesse limitazioni. Cambi a posix.environ, sys.stdin, ecc., non vengono riflessi nell'ambiente del comando eseguito.

Su Unix, il valore restituito è lo stato di uscita del processo codificato nel formato usato per wait(). Notate che POSIX non specifica il significato del valore di ritorno della funzione C system(), per cui il valore restituito della funzione Python dipende dal sistema su cui sta girando.

Su Windows, il valore restituito è quello restituito dalla shell di sistema dopo aver eseguito il comando command, ottenuto dalla variabile di ambiente di Windows COMSPEC: su sistemi con command.com (Windows 95, 98 e ME) questo valore è sempre 0; in sistemi con cmd.exe (Windows NT, 2000 e XP) questo valore corrisponde allo stato di uscita del comando eseguito; per sistemi che usano una shell non nativa, consultate la documentazione della shell.

Disponibilità: Unix, Windows.

times( )
Restituisce una quintupla di numeri in virgola mobile che indicano i tempi cumulativi (di uso del processore ed altro), in secondi. Gli elementi della tupla sono, nell'ordine: tempo utente, tempo sistema, tempo utente usato dai sotto processi, tempo sistema usato dai sotto processi, e tempo reale trascorso da un punto di riferimento fisso nel passato. Vedete la pagina di manuale Unix times(2) o la corrispondente documentazione della API della piattaforma Windows. Disponibilità: Unix, Windows.

wait( )
Attende il completamento di un processo figlio, e restituisce una tupla contenente il suo identificativo e l'indicazione del suo stato di uscita: quest'ultimo è un numero a sedici bit, il cui byte meno significativo corrisponde al codice di segnale che ha terminato il processo, mentre il suo byte più signifcativo corrisponde allo stato di uscita (se il codice del segnale è zero); il bit più significativo del byte meno significativo viene posto ad 1 se è stato prodotto un core file. Disponibilità: Unix.

waitpid( pid, options)
I dettagli di questa funzione sono diversi in Windows e Unix.

Su Unix: Attende il completamento di un processo figlio con identificativo pid, e restituisce una tupla contenente il suo identificativo e l'indicazione del suo stato di uscita (codificata come per wait()). La semantica della chiamata viene influenzata dal valore del parametro intero options, che per operazioni normali dovrebbe valere 0.

Se pid è più grande di 0, waitpid() richiede informazioni di stato per il processo specifico. Se pid vale 0, la richiesta viene effettuata per un qualunque sotto processo dello stesso gruppo del processo corrente. Se pid vale -1, la richiesta riguarda un qualsiasi processo figlio del processo corrente. Se pid è inferiore a -1, viene richiesto lo stato per un qualsiasi processo con identificativo di gruppo pari a -pid (valore assoluto di pid).

Su Windows: Attende il completamento di un processo identificato dall'handle pid e restituisce una tupla contenente pid e lo stato di uscita del processo spostato a sinistra di 8 bit (questo rende più semplice l'utilizzo multipiattaforma della funzione). Un valore del pid minore o uguale a 0 non ha significato particolare in Windows, e causa il sollevamento di un'eccezione. Il valore del parametro intero options non ha effetto. pid può riferirsi a qualunque processo di cui si conosca l'dentificativo, non necessariamente ad un processo figlio. La funzione spawn() chiamata con P_NOWAIT restituisce degli handle adatti per venire usati con questa funzione.

WNOHANG
Questa è l'opzione per waitpid() che fa in modo che la funzione non si blocchi nel caso non sia immediatamente disponibile lo stato di alcun processo figlio. Disponibilità: Unix.

WCONTINUED
Questa opzione fa in modo che venga riportato lo stato di un processo figlio se questo viene fatto continuare dopo essere stato fermato con un comando di controllo del job, all'ultimo controllo di stato. Disponibilità: alcuni sistemi Unix. Nuovo nella versione 2.3.

WUNTRACED
Questa opzione fa in modo che lo stato dei processi figli venga riportato, qualora questi vengano bloccati ma il loro stato corrente non sia più stato riportato da quando sono stati bloccati. Disponibilità: Unix. Nuovo nella versione 2.3.

Le seguenti funzioni accettano come argomento un codice di uscita di un processo come restituito da system(), wait(), o waitpid(). Possono venire usate per determinare il modo in cui è terminato il processo.

WCOREDUMP( status)
Restituisce True se viene generato un core dump per il processo, altrimenti restituisce False. Disponibilità: Unix. Nuovo nella versione 2.3.

WIFCONTINUED( status)
Restituisce True se il processo viene fatto continuare dopo essere stato bloccato, altrimenti restituisce False. Disponibilità: Unix. Nuovo nella versione 2.3.

WIFSTOPPED( status)
Restituisce True se il processo viene bloccato, altrimenti restituisce False. Disponibilità: Unix.

WIFSIGNALED( status)
Restituisce True se il processo è terminato a causa di un segnale, altrimenti restituisce False. Disponibilità: Unix.

WIFEXITED( status)
Restituisce True se il processo è terminato usando la funzione di sistema exit(2), altrimenti restituisce False. Disponibilità: Unix.

WEXITSTATUS( status)
Se WIFEXITED(status) vale True, restistuisce il parametro intero passato alla funzione di sistema exit(2). Altrimenti, il valore restituito è privo di significato. Disponibilità: Unix.

WSTOPSIG( status)
Restituisce il codice del segnale che ha bloccato il processo. Disponibilità: Unix.

WTERMSIG( status)
Restituisce il codice del segnale che ha causato la terminazione del processo. Disponibilità: Unix.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.