Exec System Call em C

Exec System Call C



A família exec tem muitas funções em C. Essas funções C são basicamente usadas para executar um comando do sistema em um processo separado que o programa principal e imprimir a saída.

Neste artigo, vou falar sobre a família de funções exec e mostrar como usar cada uma dessas funções da família exec em C. Então, vamos começar.







Funções do sistema C na família Exec:

As famílias de funções exec são definidas no cabeçalho unistd.h . Portanto, você deve usar este cabeçalho no programa C onde deseja usar essas funções.



As funções exec disponíveis junto com seus parâmetros de função são fornecidas abaixo:



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

Vamos ver o que cada uma dessas funções faz e como usá-las.





execl () Função do sistema:

Em execl (), a função do sistema leva o caminho do arquivo binário executável (ou seja, / bin / ls ) como primeiro e segundo argumentos. Em seguida, os argumentos (ou seja, -lh , /casa ) que você deseja passar para o executável seguido por NULO . Então a função de sistema execl () executa o comando e imprime a saída. Se ocorrer algum erro, execl () retorna -1. Caso contrário, não retorna nada.

Sintaxe:

intexecl(const Caracteres *caminho, const Caracteres *nervoso,...,NULO);

Um exemplo da função de sistema execl () é fornecido abaixo:



#incluir

inta Principal(vazio) {
Caracteres *binaryPath= '/ bin / ls';
Caracteres *arg1= '-lh';
Caracteres *arg2= '/casa';

execl(binaryPath,binaryPath,arg1,arg2,NULO);

Retorna 0;
}

Eu corri o ls -lh / home comando usando a função de sistema execl (). Como você pode ver, o resultado correto é exibido.

execlp () Função do sistema:

execl () não usa o CAMINHO variável de ambiente. Portanto, o caminho completo do arquivo executável é necessário para executá-lo com execl (). execlp () usa a variável de ambiente PATH. Portanto, se um arquivo executável ou comando estiver disponível no PATH, o comando ou o nome do arquivo é suficiente para executá-lo, o caminho completo não é necessário.

Sintaxe:

intexeclp(const Caracteres *Arquivo, const Caracteres *nervoso,...,NULO);

Podemos reescrever o exemplo execl () usando a função do sistema execlp () da seguinte maneira:

#incluir

inta Principal(vazio) {
Caracteres *nome do programa= 'ls';
Caracteres *arg1= '-lh';
Caracteres *arg2= '/casa';

execlp(nome do programa,nome do programa,arg1,arg2,NULO);

Retorna 0;
}

Eu só passei o nome do comando ls , não o caminho completo / bin / ls . Como você pode ver, obtive a mesma saída de antes.

execv () Função do sistema:

Na função execl (), os parâmetros do arquivo executável são passados ​​para a função como argumentos diferentes. Com execv (), você pode passar todos os parâmetros em uma matriz terminada em NULL argv . O primeiro elemento da matriz deve ser o caminho do arquivo executável. Caso contrário, a função execv () funciona exatamente como a função execl ().

Sintaxe:

intexecv(const Caracteres *caminho, Caracteres *constargv[]);

Podemos reescrever o exemplo execl () da seguinte maneira:

#incluir

inta Principal(vazio) {
Caracteres *binaryPath= '/ bin / ls';
Caracteres *args[] = {binaryPath, '-lh', '/casa',NULO};

execv(binaryPath,args);

Retorna 0;
}

Como você pode ver, estou obtendo a saída correta.

execvp () Função do sistema:

Funciona da mesma maneira que a função de sistema execv (). Mas, a variável de ambiente PATH é usada. Portanto, o caminho completo do arquivo executável não é necessário apenas como em execlp ().

Sintaxe:

intexecvp(const Caracteres *Arquivo, Caracteres *constargv[]);

Podemos reescrever o exemplo execv () da seguinte maneira:

#incluir

inta Principal(vazio) {
Caracteres *nome do programa= 'ls';
Caracteres *args[] = {nome do programa, '-lh', '/casa',NULO};

execvp(nome do programa,args);

Retorna 0;
}

Como você pode ver, a saída correta é exibida.

execle () Função do sistema:

Funciona exatamente como execl (), mas você pode fornecer suas próprias variáveis ​​de ambiente junto com ele. As variáveis ​​de ambiente são passadas como um array envp . O último elemento do envp array deve ser NULL. Todos os outros elementos contêm os pares de valores-chave como string.

Sintaxe:

intexecle(const Caracteres *caminho, const Caracteres *nervoso,...,NULO, Caracteres * constenvp[] );

Um exemplo da função de sistema execle () é fornecido abaixo:

#incluir

inta Principal(vazio) {
Caracteres *binaryPath= '/ bin / bash';
Caracteres *arg1= '-c';
Caracteres *arg2= 'jogou fora 'Visite $ HOSTNAME:$ PORT do seu navegador.'';
Caracteres *constenv[] = {'HOSTNAME=www.linuxhint.com', 'PORT = 8080',NULO};

execle(binaryPath,binaryPath,arg1,arg2,NULO,env);

Retorna 0;
}

Passei duas variáveis ​​de ambiente NOME DE ANFITRIÃO e PORTA para a função execle (). Como você pode ver, posso acessá-los a partir do executável / bin / bash .

execve () Função do sistema:

Assim como execle (), você pode fornecer suas próprias variáveis ​​de ambiente junto com execve (). Você também pode passar argumentos como matrizes, como fez em execv ().

Sintaxe:

intexecvo(const Caracteres *Arquivo, Caracteres *constargv[], Caracteres *constenvp[]);

O exemplo execle () pode ser reescrito da seguinte forma:

#incluir

inta Principal(vazio) {
Caracteres *binaryPath= '/ bin / bash';
Caracteres *constargs[] = {binaryPath, '-c', 'jogou fora 'Visite $ HOSTNAME:$ PORT
do seu navegador.'',NULO};
Caracteres *constenv[] = {'HOSTNAME=www.linuxhint.com', 'PORT = 8080',NULO};

execvo(binaryPath,args,env);

Retorna 0;
}

Como você pode ver, obtemos a mesma saída do exemplo execle ().

Então, é assim que você usa a família de funções exec em C para programação de sistema no Linux. Obrigado por ler este artigo.