Chiamata di sistema Exec in Do

Exec System Call C



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, è necessario utilizzare questa intestazione nel programma C in cui si desidera utilizzare queste funzioni.



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



  • int execl(const char *percorso, const char *arg, …, NULL);
  • int execlp(const char *file, const char *arg, …, NULL );
  • int execv(const char *percorso, char *const argv[]);
  • int execvp(const char *file, char *const argv[]);
  • int execle(const char *percorso, const char *arg, …, NULL, char * const envp[] );
  • int execve(const char *file, char *const argv[], char *const envp[]);

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 (es. / bin / ls ) come primo e secondo argomento. Quindi, gli argomenti (es. -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. In caso contrario, non restituisce nulla.

Sintassi:

inteccellente(cost char *il percorso, cost char *arrabbiato,...,NULLO);

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



#includere

intprincipale(vuoto) {
char *binarioPath= '/bin / ls';
char *arg1= '-sinistra';
char *arg2= '/casa';

eccellente(binarioPath,binarioPath,arg1,arg2,NULLO);

Restituzione 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 IL PERCORSO variabile d'ambiente. Quindi, è necessario il percorso completo del file eseguibile per eseguirlo con execl(). execlp() utilizza 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:

intexeclp(cost char *file, cost char *arrabbiato,...,NULLO);

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

#includere

intprincipale(vuoto) {
char *nome del programma= 'l';
char *arg1= '-sinistra';
char *arg2= '/casa';

execlp(nome del programma,nome del programma,arg1,arg2,NULLO);

Restituzione 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:

intexecv(cost char *il percorso, char *costargv[]);

Possiamo riscrivere l'esempio execl() come segue:

#includere

intprincipale(vuoto) {
char *binarioPath= '/bin / ls';
char *argomenti[] = {binarioPath, '-sinistra', '/casa',NULLO};

execv(binarioPath,argomenti);

Restituzione 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:

intexecvp(cost char *file, char *costargv[]);

Possiamo riscrivere l'esempio execv() come segue:

#includere

intprincipale(vuoto) {
char *nome del programma= 'l';
char *argomenti[] = {nome del programma, '-sinistra', '/casa',NULLO};

execvp(nome del programma,argomenti);

Restituzione 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:

intexecle(cost char *il percorso, cost char *arrabbiato,...,NULLO, char * costambiente[] );

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

#includere

intprincipale(vuoto) {
char *binarioPath= '/bin/bash';
char *arg1= '-C';
char *arg2= 'buttato fuori'Visita $HOSTNAME:$PORT dal tuo browser.'';
char *costenv[] = {'HOSTNAME=www.linuxhint.com', 'PORTA=8080',NULLO};

execle(binarioPath,binarioPath,arg1,arg2,NULLO,env);

Restituzione 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:

intesecutivo(cost char *file, char *costargv[], char *costambiente[]);

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

#includere

intprincipale(vuoto) {
char *binarioPath= '/bin/bash';
char *costargomenti[] = {binarioPath, '-C', 'buttato fuori'Visita $HOSTNAME:$PORT
dal tuo browser.'',NULLO};
char *costenv[] = {'HOSTNAME=www.linuxhint.com', 'PORTA=8080',NULLO};

esecutivo(binarioPath,argomenti,env);

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