Posix Spawn con la programmazione C

Posix Spawn con la programmazione C
Spawn è una funzione utilizzata in posix per caricare ed eseguire i processi figlio. Il processo attualmente in esecuzione in POSIX continuerà o non continuerà a eseguire questi processi per bambini e altri processi in modo asincrono. Ogni volta che viene creato un nuovo sottoprocesso, richiede una memoria specifica che consentirà all'esecuzione del processo genitore e figlio. In Microsoft Windows, Unix e Linux, c'è una certa famiglia di spawn; e altre famiglie di funzioni di spawn sono considerate un'estensione opzionale.

Perché usare Posix Spawn?

IL posix_spawn () E posix_spawnp () Le funzioni sono entrambe utilizzate per creare un nuovo processo di figlio. Il processo figlio quindi esegue un file. Queste funzioni sono state specificate da POSIX per standardizzare il metodo di creazione di nuovi processi per macchine che non dispongono di supporto per le chiamate del sistema fork. Queste macchine sono generalmente piccole e mancano dei sistemi incorporati per il supporto LMMU.

Le due funzioni combinano fork e exec, con alcuni passaggi aggiuntivi che eseguiranno il bambino. Agiscono come un sottoinsieme di funzionalità, di solito raggiunto con una forchetta, per tutte le chiamate di sistema e i sistemi incorporati che non hanno tale funzionalità.

Esempio 1: posix_spawn ()

In questo esempio, useremo la funzione spawn () per creare ed eseguire un nuovo processo figlio. Quindi spiegheremo tutti gli argomenti pertinenti utilizzati nella funzione.

Gli argomenti usati nell'esempio sono i seguenti:

Discussione Descrizione
Utilizzato per definire tutte le operazioni di prestazione di spawn.
sentiero Il nome del percorso che deve essere eseguito.
fd_count Il numero delle voci con l'array di FD_MAP. Se fd_count è uguale a 0, allora FD_MAP viene ignorato. In tali casi, il processo figlio eredita tutti i descrittori di file, ignorando quelli che sono stati modificati.
fd_map
Una serie di descrittori di file che devono essere ereditati dal processo figlio. Qui, se il valore di FD_COUNT non è 0, è necessario FD_MAP per portare i descrittori di file FD_COUNT a un valore supremo di Open_Max. Esso ha:

· L'input del processo figlio

· Il risultato

· I valori di errore

ereditare L'eredità della struttura mostra che gli utenti vogliono che il processo del proprio figlio erediti tutto dal genitore.
argv Il puntatore a un particolare vettore dell'argomento. Il valore argv [0] non può essere nullo e deve essere il nome file che viene caricato. Il valore Argv non può essere uguale a null.
envp Punta a una serie di puntatori di personaggi. Ognuno dei puntatori in questo array indica una variabile di ambiente. Il punto di finitura dell'array è un puntatore nullo.

Esempio 2: test.C

Nell'esempio seguente, viene creato un nuovo processo figlio per eseguire il comando da /bin/sh -c. Questo è il valore approvato come primo argomento. IL test.C Il codice è il seguente:

Nell'esempio sopra, abbiamo chiamato le biblioteche, quindi chiamate produrre.H intestazione. Vedrai anche il posix_spawn () chiamato a creare un processo figlio nell'esempio sopra. IL produrre E spawnp Le funzioni sono utilizzate al posto del forchetta E Exec funzioni. Produrre() ha flessibilità e offre molta facilità agli utenti in molti modi. È un po 'diverso da sistema() E Exec (). Tornerà e creerà il nuovo processo per bambini. Nel nostro esempio, lo è pid. Sopra, puoi vedere che la funzione di attesa waitpid (), Poi sistema() si usa. Notare che il produrre() E forchetta() I processi di chiamata sono gli stessi e il metodo di implementazione è più o meno lo stesso per entrambe le funzioni.

Ora eseguiremo l'esempio usando un GCC compilatore. Puoi anche usare qualsiasi altro compilatore a tua scelta:

Test $ sudo GCC.c -lrt

Successivamente, esegui quanto segue:

$ ./UN.fuori

L'output del comando sopra apparirà come segue:

Il bambino pid verrà creato, come puoi vedere nell'output sopra.

Biblioteca

Libc: Usa il -l c per collegare il GCC compilatore. Qui, nota che questa libreria è inclusa automaticamente.

Produrre()

IL produrre() La funzione si basa su Posix 1003.1D Draft Standard utilizzato come posix_spawn (). La libreria C include le funzioni di spawn*(). Qui, elencheremo alcuni suffissi, insieme alle loro descrizioni:

E: usato come array per le variabili di ambiente.

L: usato come elenco di argomenti terminati null utilizzati all'interno del programma.

P: usato per definire un percorso relativo. Se il percorso non ha una barra nel suo valore, il sistema utilizza e cerca la variabile dell'ambiente del percorso per qualsiasi programma simile.

V: funge da vettore di argomenti all'interno del programma.

Mappatura dei descrittori di file

In produrre(), pratichiamo il fd_count E fd_map argomenti per chiamare i descrittori di file. Specifica quale bambino ereditare.

Il numero usato come descrittore di file per il processo figlio dipende dalla sua posizione all'interno del fd_map. Qui considereremo l'esempio del genitore con descrittori di file valutati 1, 3 e 5, quindi la mappatura sarà qualcosa del genere:

>> int fd_map = 1, 3, 5;
Per il bambino Per il genitore
0 1
1 3
2 5

Nota che se si utilizza l'esplicito fd_map Per abbinare questi descrittori di file con il figlio e il genitore, è necessario mappare il Spwan_fdclose funzione per procedere.

Bandiere ereditarie

In Spawn, gli utenti devono chiamare una delle seguenti flag in caso di eredità. Di seguito sono riportati alcuni esempi di bandiere di spawn e le loro descrizioni:

Bandiera Descrizione
Spawn_align_default Questo flag viene utilizzato per impostare le impostazioni predefinite dell'impostazione per l'allineamento.
Spawn_align_fault Questo flag viene utilizzato per il disallineamento dei guasti dei riferimenti di dati.
Spawn_align_nofault Questo flag viene utilizzato per correggere il disallineamento dei guasti.
Spawn_debug Questa bandiera viene utilizzata per eseguire il debug del kernel.
Spawn_exec Spawn si comporta come Exec*() usando questo flag.
Spawn_explicit_cpu Questo flag viene utilizzato per impostare la maschera di corsa e ereditare la maschera = membro della maschera run.
Spawn_explicit_sched Questo flag viene utilizzato per impostare la politica di pianificazione.

IL <produrre.H> definisce quella maschera Spawn_align_mask Utilizzato per allineare le flag elencate sopra.

PGROUP PID_T Il gruppo di processo figlio se si specifica Spawn_setGroup nel membro della flag.
int runmask La maschera del bambino per ereditare le maschere concordate in base al valore di questo membro.
Sigset_t Sigmask La maschera del segnale per il processo figlio utilizzato per specificare lo stato dei membri della flag.
sigset_t sigdefault L'insieme dei processi figlio dei segnali predefiniti.

Errori

IL posix_spawn () E posix_spawnp () Le funzioni possono anche fallire in alcuni casi, come le seguenti:

Einval: Questo è il caso in cui il valore identificato da file_actions O attrp non è corretto e adeguato.

Quando la chiamata sottostante (2), forcella (2) o clone (2) non riesce, la produrre() Le funzioni restituiranno un numero di errore.

Enosys: Questo è il caso se la funzione e il suo supporto non sono inclusi o forniti all'interno di un sistema.

Conclusione

Questo tutorial ha coperto le funzionalità di base fornite da Posix_spawn () e le funzioni da esso utilizzate per eseguire ed eseguire le sue funzioni. Abbiamo anche coperto le bandiere e gli errori comunemente usati da Spawn.