C Programmazione

Codifica con fork ed exec per esempio in c

Codifica con fork ed exec per esempio in c
Il titolo del nostro articolo contiene due diverse funzioni del linguaggio C che si verificano durante l'esecuzione di qualsiasi programma nel nostro sistema. Sfortunatamente, non c'è nessuna possibilità che si verifichi più di un programma alla volta in C. È possibile eseguire solo una singola attività in un determinato momento, il che significa che non consente l'esecuzione di programmi concorrenti. Ti fa aspettare il completamento di un processo per eseguire l'altro. Per evitare questo problema di risoluzione dei problemi, potresti dover sviluppare il tuo programma in modo corretto, essendo un buon sviluppatore. Linux fork() viene utilizzato per superare l'attesa e consentire la concorrenza nel sistema. Aiuta a duplicare un nuovo processo e ne crea uno nuovo chiamando il processo duplicato. Il nuovo processo è il processo figlio e il precedente è chiamato processo padre.

Considerando che, la funzione exec() viene utilizzata per cambiare il programma esistente corrente con quello nuovo new. Questa sostituzione viene effettuata apportando modifiche al contenuto di un programma o di un file. Quindi la differenza tra fork ed exec è che fork crea un nuovo processo dal processo esistente e exec viene utilizzato per sostituire il programma esistente creandone uno nuovo.

Prerequisiti

Per eseguire qualsiasi programma c sul tuo sistema Linux, dobbiamo installare alcuni prerequisiti su di esso. Vai al terminale usando il metodo di scelta rapida Ctrl+Alt+T. Ora scrivi i seguenti comandi per installare le pagine man.

$ sudo apt install manpages-dev

Installerà tutte le pagine corrispondenti.

Andando avanti, per eseguire un programma su Linux, è necessario installare un compilatore di codice. Viene utilizzato per compilare il codice ed eseguirlo. A questo scopo, installeremo i repository GCC nel nostro sistema.

$ sudo apt install GCC

Codifica con exec in c

Poiché abbiamo installato le pagine man in Linux, utilizzeremo il seguente comando per vedere la descrizione relativa a exec. La sintassi del campione principale è la seguente:

Sintassi

Exec (percorso/file, argv );

Qui abbiamo usato il “unistd.h" in quanto contiene tutte le informazioni delle famiglie della funzione exec.

$ uomo dirigente

Ora nell'immagine sopra citata, puoi osservare i tipi di exec. Queste sono la famiglia delle funzioni esecutive. Ognuno è per una funzione diversa seguendo la stessa base, "exec."

Esempio: Ora, andando oltre, descriveremo la funzionalità di exec con l'aiuto di un esempio. Prenderemo una funzione di exec per dimostrare il suo funzionamento, che è "execv.” In primo luogo, creeremo due file con l'estensione di “.c.” Dopo la loro creazione, vi scriveremo i rispettivi codici e li eseguiremo per vedere il risultato.

Considera un nome di file "campione4.c". Si prega di aprirlo e utilizzare il seguente codice. In questo codice, abbiamo usato execv in un modo particolare citato di seguito.

Esecutivo ("./sample4copy” , argomenti);

La prima parte contiene il nuovo percorso della directory e la seconda parte mostra l'array degli argomenti come parametro che abbiamo passato.

Campione4.c

Prima di tutto, abbiamo stampato l'id del processo corrente. In secondo luogo, abbiamo creato un array di caratteri con NULL alla fine per la terminazione. In terzo luogo abbiamo chiamato la funzione sample4copy.

Campione4copia.c

Quando chiamiamo la funzione exec(), l'immagine del processo viene modificata. L'immagine sotto citata sotto mostra il codice di sample4copy.c.

Qui abbiamo usato solo le istruzioni print per ottenere l'id del processo corrente.

L'output dei rispettivi codici può essere ottenuto utilizzando i seguenti comandi.

$ GCC-o campione4 campione4.c
$ GCC -o sample4copy sample4copy.c
$ ./campione4

Come abbiamo descritto in precedenza, la parola "GCC" viene utilizzata per compilare il codice e, dopo la compilazione, il codice viene eseguito correttamente.

Secondo l'immagine, il PID di sample4.c viene mostrato per primo come è stato dichiarato prima della chiamata exec. Quindi, dopo aver chiamato la funzione exec(), entrambe le istruzioni print del file sample4copy.c viene eseguito dove getpid() viene utilizzato per ottenere l'id del processo.

Codificare con una forchetta in c

La funzione fork() crea il processo figlio dal processo padre. Contiene anche due intestazioni, incluse le informazioni sulla forcella in esso.

Sintassi:

Pid_t fork(void);

Possiamo usare la pagina man per aiuto nell'uso

$ uomo forchetta

Esempio: Consideriamo ora un esempio creando un file “sample3.c". Inseriremo il codice all'interno del file. Secondo il codice, abbiamo impostato lo stato del fork come forkrank.

Campione3.c

Abbiamo usato l'istruzione "if-else" per applicare la condizione. Qui vengono dichiarati semplici comandi di stampa per aiutare nella comprensione del concetto fork(). Forkrank viene prima dichiarato 0 e poi -1. Con un fork(), ora ci sono due processi che funzionano contemporaneamente. L'output può essere ottenuto utilizzando lo stesso codice, come usato sopra nell'esempio exec.

$ GCC -o campione3.c
$./campione3

L'output mostra che il processo figlio viene eseguito prima del processo padre quando il processo padre era in attesa. La funzione di attesa implica che fa sì che la funzione padre attenda a meno che uno di tutti i processi figlio non venga terminato.

Chiamate di sistema Fork ed Exec collettivamente

Qui prenderemo due file denominati "sample1.c" e "campione2.c". Per prima cosa, apri il file sample1.c e scrivi il codice che è allegato sotto nell'immagine. Abbiamo usato la chiamata di sistema fork() qui; quando viene creato il processo figlio, p verrà assegnato con 0. Durante l'utilizzo della chiamata di sistema exec, il campione1.c sarà sostituito con sample2.c.

Campione1.c

Campione2.c

Simile agli esempi discussi sopra, il file sample2 conterrà le istruzioni printf al suo interno. Nel campione1.c, viene eseguito per primo il primo comando print, quindi viene chiamata la funzione fork, quando p== 0, quindi viene eseguita la parte figlio e sample2.c verrà eseguito. L'output conterrà GCC per compilare entrambi i file. Qui genitore campione1.c id e sample2.c id è diverso perché sono genitore e figlio.

Conclusione

In questo articolo, abbiamo utilizzato sia fork che exec separatamente e collettivamente per comprendere facilmente l'utilizzo e il concetto. Spero che questo tutorial contenga contenuti sufficienti che portino all'accesso nell'escalation delle tue conoscenze.

Vulkan per utenti Linux
Con ogni nuova generazione di schede grafiche, vediamo gli sviluppatori di giochi spingere i limiti della fedeltà grafica e avvicinarsi di un passo al...
OpenTTD vs Simutrans
Creare la tua simulazione di trasporto può essere divertente, rilassante ed estremamente allettante. Ecco perché devi assicurarti di provare quanti pi...
Tutorial OpenTTD
OpenTTD è uno dei giochi di simulazione aziendale più popolari in circolazione. In questo gioco, devi creare una meravigliosa attività di trasporto. T...