C Programmazione

Chiamata di sistema Exec in Do

Chiamata di sistema Exec in Do
La famiglia exec ha molte funzioni in C. Queste funzioni C sono fondamentalmente utilizzate per eseguire un comando di sistema in un processo separato dal programma principale e stampare l'output.

In questo articolo parlerò della famiglia di funzioni exec e ti mostrerò come utilizzare ognuna di queste funzioni della famiglia exec in C. Quindi iniziamo.

Funzioni di sistema C nella famiglia Exec:

Le famiglie di funzioni exec sono definite nell'intestazione unistd.h. Quindi, devi usare questa intestazione sul programma C in cui vuoi usare queste funzioni.

Di seguito sono riportate le funzioni exec disponibili insieme ai relativi parametri di funzione:

Vediamo cosa fa ciascuna di queste funzioni e come usarle.

execl() Funzione di sistema:

In execl() la funzione di sistema prende il percorso del file binario eseguibile (i.e. /bin/ls) come primo e secondo argomento. Quindi, gli argomenti (i.e. -lh, /casa) che vuoi passare all'eseguibile seguito da NULLO. Quindi la funzione di sistema execl() esegue il comando e stampa l'output. Se si verifica un errore, execl() restituisce -1. Altrimenti non restituisce nulla.

Sintassi:

int execl(const char *percorso, const char *arg,… , NULL);

Di seguito è riportato un esempio della funzione di sistema execl():

#includere
 
int main(void)
char *binaryPath = "/bin/ls";
char *arg1 = "-lh";
char *arg2 = "/home";
 
execl(binaryPath, binaryPath, arg1, arg2, NULL);
 
restituisce 0;

ho eseguito il ls -lh /home comando utilizzando la funzione di sistema execl(). Come puoi vedere, viene visualizzato il risultato corretto.

execlp() Funzione di sistema:

execl() non usa il SENTIERO variabile d'ambiente. Quindi, è necessario il percorso completo del file eseguibile per eseguirlo con execl(). execlp() usa la variabile d'ambiente PATH. Quindi, se un file eseguibile o un comando è disponibile nel PERCORSO, il comando o il nome del file è sufficiente per eseguirlo, il percorso completo non è necessario.

Sintassi:

int execlp(const char *file, const char *arg,… , NULL );

Possiamo riscrivere l'esempio execl() usando la funzione di sistema execlp() come segue:

#includere
 
int main(void)
char *nomeprogramma = "ls";
char *arg1 = "-lh";
char *arg2 = "/home";
 
execlp(nomeprogramma, nomeprogramma, arg1, arg2, NULL);
 
restituisce 0;

Ho passato solo il nome del comando ls, non il percorso completo /bin/ls. Come puoi vedere, ho ottenuto lo stesso risultato di prima.

execv() Funzione di sistema:

Nella funzione execl(), i parametri del file eseguibile vengono passati alla funzione come argomenti diversi. Con execv(), puoi passare tutti i parametri in un array terminato con NULL argv. Il primo elemento dell'array dovrebbe essere il percorso del file eseguibile. Altrimenti, la funzione execv() funziona proprio come la funzione execl().

Sintassi:

int execv(const char *percorso, char *const argv[]);

Possiamo riscrivere l'esempio execl() come segue:

#includere
 
int main(void)
char *binaryPath = "/bin/ls";
char *args[] = binaryPath, "-lh", "/home", NULL;
 
execv(binaryPath, args);
 
restituisce 0;

Come puoi vedere, sto ottenendo l'output corretto.

execvp() Funzione di sistema:

Funziona allo stesso modo della funzione di sistema execv(). Ma viene utilizzata la variabile d'ambiente PATH. Quindi, il percorso completo del file eseguibile non è richiesto proprio come in execlp().

Sintassi:

int execvp(const char *file, char *const argv[]);

Possiamo riscrivere l'esempio execv() come segue:

#includere
 
int main(void)
char *nomeprogramma = "ls";
char *args[] = nomeprogramma, "-lh", "/home", NULL;
 
execvp(nomeprogramma, argomenti);
 
restituisce 0;

Come puoi vedere, viene visualizzato l'output corretto.

execle() Funzione di sistema:

Funziona proprio come execl() ma puoi fornire le tue variabili di ambiente insieme ad esso. Le variabili d'ambiente vengono passate come un array ambiente. L'ultimo elemento della ambiente l'array dovrebbe essere NULL. Tutti gli altri elementi contengono le coppie chiave-valore come stringa.

Sintassi:

int execle(const char *percorso, const char *arg,… , NULL, char * const envp[] );

Di seguito è riportato un esempio della funzione di sistema execle():

#includere
 
int main(void)
char *binaryPath = "/bin/bash";
char *arg1 = "-c";
char *arg2 = "echo "Visita $HOSTNAME:$PORT dal tuo browser."";
char *const env[] = "HOSTNAME=www.linuxhint.com", "PORTA=8080", NULL;
 
execle(binaryPath, binaryPath,arg1, arg2, NULL, env);
 
restituisce 0;

Ho passato due variabili d'ambiente NOME HOST e PORTA alla funzione execle(). Come puoi vedere, posso accedervi dall'eseguibile /bin/bash.

execve() Funzione di sistema:

Proprio come execle() puoi fornire le tue variabili di ambiente insieme a execve(). Puoi anche passare argomenti come array come hai fatto in execv().

Sintassi:

int execve(const char *file, char *const argv[], char *const envp[]);

L'esempio execle() può essere riscritto come segue:

#includere
 
int main(void)
char *binaryPath = "/bin/bash";
char *const args[] = binaryPath, "-c", "echo "Visit $HOSTNAME:$PORT
dal tuo browser."", NULLO;
char *const env[] = "HOSTNAME=www.linuxhint.com", "PORTA=8080", NULL;
 
execve(binaryPath, args, env);
 
restituisce 0;

Come puoi vedere, otteniamo lo stesso output dell'esempio execle().

Quindi, è così che usi la famiglia di funzioni exec in C per la programmazione di sistema in Linux. Grazie per aver letto questo articolo.

Come utilizzare Xdotool per stimolare i clic del mouse e le sequenze di tasti in Linux
Xdotool è uno strumento da riga di comando gratuito e open source per simulare i clic del mouse e le sequenze di tasti. Questo articolo tratterà una b...
I 5 migliori mouse per computer ergonomici per Linux
L'uso prolungato del computer provoca dolore al polso o alle dita?? Soffri di rigidità articolare e devi continuamente stringerti la mano? Senti un do...
Come modificare le impostazioni del mouse e del touchpad utilizzando Xinput in Linux
La maggior parte delle distribuzioni Linux viene fornita con la libreria "libinput" per impostazione predefinita per gestire gli eventi di input su un...