C Programmazione

Spawn POSIX con la programmazione in C

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

Perché usare POSIX Spawn??

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

Le due funzioni combinano fork ed exec, con alcuni passaggi aggiuntivi che eseguiranno il figlio. Agiscono come un sottoinsieme di funzionalità, solitamente ottenute con un fork, per tutte le chiamate di sistema e i sistemi embedded che mancano di 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 rilevanti utilizzati nella funzione.

Gli argomenti utilizzati nell'esempio sono i seguenti:

Discussione Descrizione
Utilizzato per definire tutte le operazioni di esecuzione 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
Un array di descrittori di file che deve essere ereditato dal processo figlio. Qui, se il valore di fd_count non è 0, è necessario fd_map per portare i descrittori di file fd_count fino a un valore supremo di OPEN_MAX. Esso ha:

·       L'input del processo figlio

· Il risultato

·       I valori di errore

ereditare L'ereditarietà della struttura mostra che gli utenti vogliono che il loro processo figlio erediti tutto dal genitore.
argv Il puntatore a un particolare vettore di argomento. Il valore argv[0] non può essere NULL e deve essere il nome del file che viene caricato. Il valore argv non può essere uguale a NULL.
ambiente Punta a una serie di puntatori di caratteri. Ciascuno dei puntatori in questo array punta a una variabile d'ambiente. Il punto finale dell'array è un puntatore NULL.

Esempio 2: prova.c

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

Nell'esempio sopra, abbiamo chiamato le librerie, quindi abbiamo chiamato produrre.h intestazione. Vedrai anche il posix_spawn() chiamato per creare un processo figlio nell'esempio precedente. Il produrre e spawn le funzioni vengono utilizzate al posto di forchetta e eseguire 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 figlio. Nel nostro esempio, è pid. Sopra, puoi vedere che la funzione di attesa attesa(), 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 a gcc compilatore. Puoi anche usare qualsiasi altro compilatore di tua scelta:

$ sudo gcc test.c -lrt

Quindi, esegui quanto segue:

$ ./un.su

L'output del comando precedente sarà il seguente:

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

Biblioteca

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

Produrre()

Il produrre() la funzione è basata su POSIX 1003.1d progetto di standard utilizzato come posix_spawn(). La libreria C include funzioni spawn*()(). Qui elencheremo alcuni suffissi, insieme alle loro descrizioni:

e: usato come array per le variabili d'ambiente.

io: usato come un elenco con terminazione NULL degli argomenti 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 di ambiente PATH per qualsiasi programma simile.

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

Descrittori di file di mappatura

Nel produrre(), pratichiamo il fd_count e fd_map argomenti per richiamare i descrittori di file. Specifica quale figlio 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 con valore 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 stai usando l'esplicito fd_map per abbinare questi descrittori di file con il figlio e il genitore, allora devi mappare il SPWAN_FDCLOSE funzione per procedere.

Flag di eredità

In Spawn, gli utenti devono richiamare uno dei seguenti flag in caso di ereditarietà. Di seguito sono riportati alcuni esempi di flag Spawn e le loro descrizioni:

Bandiera Descrizione
SPAWN_ALIGN_DEFAULT Questo flag viene utilizzato per configurare le impostazioni predefinite del setup per l'allineamento.
SPAWN_ALIGN_FAULT Questo flag viene utilizzato per il disallineamento dei dati di riferimento.
SPAWN_ALIGN_NOFAULT Questo flag viene utilizzato per correggere il disallineamento del guasto.
SPAWN_DEBUG Questo flag è usato per eseguire il debug del kernel.
SPAWN_EXEC SPAWN si comporta come exec*() usando questo flag.
SPAWN_EXPLICIT_CPU Questo flag è usato per impostare la maschera di esecuzione ed ereditare il membro mask=run mask.
SPAWN_EXPLICIT_SCHED Questo flag viene utilizzato per impostare la politica di pianificazione.

Il <produrre.h> definisce quella maschera SPAWN_ALIGN_MASK usato per allineare i flag sopra elencati.

pid_t pgroup Il gruppo di processi figlio se specifichi SPAWN_SETGROUP nel membro del flag.
int runmask La runmask del processo figlio per ereditare le maschere concordate in base al valore di questo membro.
sigset_t sigmask La maschera del segnale per il processo figlio che viene utilizzata per specificare lo stato dei membri flag.
sigset_t sigdefault L'insieme dei processi figlio dei segnali in default.

Errori

Il posix_spawn() e posix_spawnp() le funzioni possono anche fallire in alcuni casi, come i seguenti:

EINVAL: Questo è il caso quando il valore identificato da file_azioni o attr non è corretto e adeguato.

Quando la chiamata sottostante fork (2), fork (2) o clone (2) fallisce, il produrre() le funzioni restituiranno un numero di errore.

ENOSI: 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 essa utilizzate per eseguire ed eseguire le sue funzioni. Abbiamo anche coperto i flag e gli errori comunemente usati da Spawn.

Come mostrare il contatore FPS nei giochi Linux
I giochi Linux hanno avuto una grande spinta quando Valve ha annunciato il supporto Linux per il client Steam e i loro giochi nel 2012. Da allora, mol...
Come scaricare e giocare a Sid Meier's Civilization VI su Linux
Introduzione al gioco Civilization 6 è una versione moderna del concetto classico introdotto nella serie dei giochi Age of Empires. L'idea era abbasta...
Come installare e giocare a Doom su Linux
Introduzione a Doom La serie Doom è nata negli anni '90 dopo l'uscita dell'originale Doom. È stato un successo immediato e da quel momento in poi la s...