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.cQuando 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.