Chiamata di sistema forcella in C

Chiamata di sistema forcella in C

“Lo scopo di base del metodo di comando fork è quello di creare uno o più processi figlio; I processi figlio appena creati vengono eseguiti contemporaneamente al processo genitore che ha creato questi processi figlio utilizzando le dichiarazioni della forcella. La prossima dichiarazione seguita dal comando fork sarà eseguita contemporaneamente sia dai processi figlio che da genitore. Gli stessi registri della CPU, il contatore del programma (PC) e aprono i file a cui gli accessi al processo genitore sono utilizzati dal processo figlio. Il comando fork non assume alcun parametro come input, ma restituisce un valore intero usando il quale possiamo facilmente identificare se il comando fork ha creato il processo figlio correttamente o no."

Di seguito è riportato l'elenco dei valori che vengono restituiti con il metodo della forcella:

  • Valore negativo: Il processo di creazione di un processo figlio non è riuscito.
  • Zero: Il processo del bambino che è stato appena creato è stato restituito.
  • Valore positivo: Restituito al chiamante o al genitore con un valore positivo. L'ID processo del processo figlio appena generato è contenuto nel valore.

Una cosa da tenere a mente è che Fork è un metodo di threading; Pertanto, per vedere i risultati; È necessario eseguire il processo sul sistema locale. Il comando fork può richiedere determinati file di intestazione o libreria, come sys/tipi.H e unistd.H. È necessario configurare un sistema operativo basato su Linux o UNIX per eseguire il programma perché il comando fork non può essere utilizzato in un ambiente Windows. È necessario prima confermare che il compilatore GCC è stato impostato nell'ambiente del sistema operativo. Per raggiungere questo obiettivo, dobbiamo prima avviare il terminale e quindi inserire la versione GCC di comando, che visualizza le informazioni che il compilatore GCC della versione 11.2.0 è stato installato.

Prima di lavorare sugli snippet del codice C, è necessario mantenere e aggiornare il sistema. Il motivo alla base del suo aggiornamento è quello di soddisfare le prossime questioni relative alle versioni più recenti di Linux. Quindi, prova la seguente query "Aggiorna" e aggiorna il tuo Linux.

Esempio 1

Cominciamo con il programma più semplice e semplice, in cui utilizziamo solo un singolo metodo fork e una semplice istruzione di stampa. I programmi richiedono file di intestazione elencati nelle prime tre righe del codice. Il metodo FORK () è chiamato nella linea di apertura del metodo principale. Il comando fork crea un processo figlio che esegue contemporaneamente l'istruzione di seguito. Di conseguenza, l'istruzione di stampa apparirà due volte nella schermata Shell quando il programma inizierà a eseguire. Iniziamo a scrivere il comando nell'ambiente di Ubuntu. Dobbiamo creare il file utilizzando Nano Editor, ma puoi usare la tua scelta. Digita il comando seguente per creare il nuovo file:

nano forkthread.C

Quando l'editor apre un file in modalità di modifica, è vuoto, quindi dobbiamo inserire il codice lì prima di chiudere il file e salvarlo. Il comando fork deve essere preceduto da un'istruzione che indica che il processo figlio verrà avviato dopo questo comando. Dopo la forcella, l'istruzione di stampa verrà eseguita due volte, una volta dal processo genitore e quindi dal processo figlio di nuova costituzione. Questa affermazione verrà eseguita solo una volta.

#includere
#includere
#includere
int main ()
printf ("prima del metodo della forcella.\N");
forchetta();
printf ("processo figlio creato.\N");
restituzione 0;

Dopo aver salvato e chiuso la biforcazione.File C, dobbiamo ora utilizzare il compilatore GCC per compilare il file C e creare il file di output utilizzando il comando seguente.

GCC Forkthread.C -o forkthread.fuori

Il file C verrà compilato dal compilatore GCC e i risultati verranno salvati sul biforcico.File fuori. Tuttavia, se non si utilizza il flag -o, il compilatore GCC memorizzerà l'uscita a A.File fuori, che è il suo nome predefinito, dopo la compilation. L'immagine mostra come possiamo compilare il file C usando il comando sopra.

I risultati della compilation rivelano che non vi erano errori di sintassi o semantici nel nostro codice, dimostrando che era stato compilato con successo e che il file di output era stato generato con successo. È possibile visualizzare i risultati ora che il file di output è stato eseguito. Basta digitare il comando breve di seguito per raggiungere questo obiettivo:

./ForkThread.fuori

Esempio 2

In questo esempio, conterremo le istanze in cui vengono eseguiti un pezzo di codice che contiene numerose righe fork (). Dobbiamo scrivere numerosi metodi di forcella e modificare il codice esistente. Dovresti essere consapevole che il numero di volte in cui viene eseguito un pezzo di codice dipende dalla potenza di 2, il numero di volte in cui è stata scritta l'istruzione fork. Ad esempio, se l'istruzione fork è stata scritta tre volte, il codice verrà eseguito 2^3 = 8 volte. Di seguito è riportato lo snippet del codice C aggiornato per una chiamata di sistema fork.

#includere
#includere
#includere
int main ()
printf ("prima del metodo della forcella.\N");
int i = 0;
forchetta();
forchetta();
forchetta();
printf ("processo figlio creato: [%d] \ n", i);
I ++;
restituzione 0;

Nel codice sopra, ci sono tre dichiarazioni di forcella e, prima di loro, abbiamo dichiarato una variabile "i" del tipo intero che verrà utilizzata per tracciare il processo che ogni istruzione fork crea. Questa variabile verrà anche incrementata dopo ciascuna istruzione fork e prima dell'istruzione di ritorno. Poiché il codice è stato modificato, ricompiliamolo usando il compilatore GCC. Il file di output viene generato correttamente.

Come puoi vedere, la variabile "i" non è stata aumentata in alcun modo perché l'istruzione forcella è immediatamente seguita da un'istruzione di stampa che stampa otto volte, il che significa che ogni istruzione fork contiene un processo che esegue simultaneamente il codice di cui sopra e usa solo Una copia del programma, impedendo a qualsiasi incremento che si svolge nel codice. Ci sono un totale di otto metodi di stampa separati utilizzati per stampare il messaggio di seguito. Come puoi vedere, non c'è incremento. Perché il processo figlio esegue solo un comando di stampa.

Conclusione

Si trattava di usare la chiamata di sistema "fork" C. Abbiamo provato illustrazioni diverse per ottenere output diversi e sono stati utilizzati diversi metodi. Se vuoi ottenere una presa completa sulla chiamata del sistema C "Fork", prova a implementare i due esempi sopra in vari modi dalla tua fine e sei a posto.