next up previous
Next: Comportamento em relação aos Up: As primitivas envolvendo processos Previous: Primitiva exit()

As Primitivas exec()

       #include <unistd.h>

       extern char **environ;

       int execl( const char *path, const char *arg, ...);
       int execlp( const char *file, const char *arg, ...);
       int  execle( const char *path, const char *arg , ..., 
                    char* const envp[]);

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

As primitivas exec() constituem na verdade uma família de funções (execl, execlp, execle, execv, execvp) que permitem o lançamento da execução de um programa externo ao processo. Não existe a criação efetiva de um novo processo, mas simplesmente uma substituição do programa de execução.

Existem seis primitivas na família, as quais podem ser divididas em dois grupos: os execl(), para o qual o número de argumentos do programa lançado é conhecido; e os execv(), para o qual esse número é desconhecido. Em outras palavras, estes grupos de primitivas se diferenciam pelo número de parâmetros passados.

O parâmetro inicial destas funções é o caminho do arquivo a ser executado.

Os parâmetros char arg, ... para as funções execl, execlp e execle podem ser vistos como uma lista de argumentos do tipo arg0, arg1, ..., argn passadas para um programa em linha de comando. Esses parâmetros descrevem uma lista de um ou mais ponteiros para strings não-nulas que representam a lista de argumentos para o programa executado.

As funções execv e execvp fornecem um vetor de ponteiros para strings não-nulas que representam a lista de argumentos para o programa executado.

Para ambos os casos, assume-se, por convenção, que o primeiro argumento vai apontar para o arquivo associado ao nome do programa sendo executado. A lista de argumento deve ser terminada pelo ponteiro NULL.

A função execle também especifica o ambiente do processo executado após o ponteiro NULL da lista de parâmetros ou o ponteiro para o vetor argv com um parâmetro adicional. Este parâmetro adicional é um vetor de ponteiros para strings não-nulas que deve também ser finalizado por um ponteiro NULL. As outras funções consideram o ambiente para o novo processo como sendo igual ao do processo atualmente em execução.

Valor de retorno: Se alguma das funções retorna, um erro terá ocorrido. O valor de retorno é -1 neste caso, e a variel global errno será setada para indicar o erro.

Na chamada de uma função exec(), existe um recobrimento do segmento de instruções do processo que chama a função. Desta forma, não existe retorno de um exec() cuja execução seja correta (o endereço de retorno desaparece). Em outras palavras, o processo que chama a função exec() morre.

O código do processo que chama uma função exec() será sempre destruído, e desta forma, não existe muito sentido em utilizá-la sem que ela esteja associada a uma primitiva fork().

Exemplo:

                /* arquivo test_exec.c */

#include <stdio.h>
#include <unistd.h>

int main()
{
      execl("/bin/ls","ls","test_exec.c",NULL) ;
      printf ("Eu ainda nao estou morto\n") ;
      exit(0);
}

Resultado da execução:

euler:~/> test_exec
test_exec.c

O comando ls é executado, mas o printf não. Isto mostra que o processo não retorna após a execução do execl.

O exemplo seguinte mostra a utilidade do fork neste caso.

Exemplo:

                 /* arquivo test_exec_fork.c */

#include <stdio.h>
#include <unistd.h>

int main()
{
     if ( fork()==0 ) execl( "/bin/ls","ls","test_exec.c",NULL) ;
     else {
          sleep(2) ;  /* espera o fim de ls para executar o printf() */
          printf ("Eu sou o pai e finalmente posso continuar\n") ;
     }
     exit(0);
}

Resultado da execução:

euler:~/> test_exec_fork
test_exec.c
Eu sou o pai e finalmente posso continuar

Neste caso, o filho morre após a execução do ls, e o pai continuará a viver, executando então o printf.



Subsections
next up previous
Next: Comportamento em relação aos Up: As primitivas envolvendo processos Previous: Primitiva exit()
Celso Alberto Saibel Santos 2000-11-14