Mais precisamente, podemos dizer que o uso da chamada do sistema EXEC substituirá o arquivo ou programa antigo do processo por um novo arquivo ou programa. Todo o conteúdo do processo é substituído por um novo programa.
O segmento de dados do usuário que executa a chamada do sistema EXEC () é substituída pelo arquivo de dados cujo nome é fornecido no argumento enquanto chama Exec ().
O novo programa é carregado no mesmo espaço de processo. O processo atual é apenas transformado em um novo processo e, portanto, o ID do processo não é alterado, isso ocorre porque não estamos criando um novo processo, estamos apenas substituindo um processo por outro processo no executivo.
Se o processo atualmente em execução contiver mais de um thread, todos os threads serão encerrados e a nova imagem do processo será carregada e executada. Não há funções de destruidores que encerram fios do processo atual.
O PID do processo não é alterado, mas os dados, código, pilha, heap, etc. do processo são alterados e são substituídos pelos do processo recém -carregado. O novo processo é executado a partir do ponto de entrada.
O Exec System Call é uma coleção de funções e, na linguagem de programação C, os nomes padrão para essas funções são os seguintes:
Deve -se notar aqui que essas funções têm a mesma base exec seguido de uma ou mais letras. Estes são explicados abaixo:
e: É uma variedade de indicadores que aponta para variáveis ambientais e é passada explicitamente para o processo recém -carregado.
eu: l é para os argumentos da linha de comando que passaram uma lista para a função
P: P é a variável de ambiente do caminho que ajuda a encontrar o arquivo passado como um argumento a ser carregado em processo.
v: v é para os argumentos da linha de comando. Estes são passados como uma variedade de ponteiros para a função.
Por que o EXEC é usado?
Exec é usado quando o usuário deseja iniciar um novo arquivo ou programa no mesmo processo.
Trabalho interno do executivo
Considere os seguintes pontos para entender o funcionamento do executivo:
Sintaxe das funções da família Exec:
A seguir, são apresentadas as sintaxes para cada função do EXEC:
int execl (const char* caminho, const char* arg,…)Descrição:
O tipo de retorno dessas funções é int. Quando a imagem do processo é substituída com sucesso, nada é retornado à função de chamada porque o processo que a chamou não está mais em execução. Mas se houver algum erro -1 será devolvido. Se ocorrer algum erro um errno está definido.
Na sintaxe:
Para usar as funções da família EXEC, você precisa incluir o seguinte arquivo de cabeçalho em seu programa C:
#incluirExemplo 1: Usando o programa Exec System Call in C
Considere o exemplo a seguir, no qual usamos o sistema EXEC Chamada na programação C em Linux, Ubuntu: temos dois arquivos C aqui Exemplo.c e olá.C:
CÓDIGO:
#incluirCÓDIGO:
#incluirSAÍDA:
Pid de exemplo.c = 4733No exemplo acima, temos um exemplo.Arquivo C e olá.Arquivo C. No exemplo .C FILE ADIMENTO DE COMPLETO QUE PRIMOS O ID do processo atual (exemplo de arquivo.C está sendo executado no processo atual). Então, na próxima linha, criamos uma variedade de ponteiros de personagem. O último elemento desta matriz deve ser nulo como o ponto de rescisão.
Em seguida, usamos a função Execv () que leva o nome do arquivo e a matriz de ponteiro do personagem como seu argumento. Deve -se notar aqui que usamos ./ Com o nome do arquivo, ele especifica o caminho do arquivo. Como o arquivo está na pasta onde o exemplo.C reside para que não há necessidade de especificar o caminho completo.
Quando a função Execv () é chamada, nossa imagem de processo será substituída agora o exemplo do arquivo.c não está no processo, mas o arquivo olá.C está em processo. Pode -se observar que o ID do processo é o mesmo se olá.c é imagem ou exemplo de processo.C é a imagem do processo porque o processo é o mesmo e a imagem do processo é substituída apenas.
Então temos outra coisa a observar aqui, que é a instrução printf () após o Execv () não é executado. Isso ocorre porque o controle nunca é devolvido à imagem antiga do processo depois que a nova imagem do processo substitui -a. O controle só volta à função de chamada ao substituir a imagem do processo não tem sucesso. (O valor de retorno é -1 neste caso).
Diferença entre as chamadas do sistema Fork () e EXEC ():
A chamada do sistema Fork () é usada para criar uma cópia exata de um processo em execução e a cópia criada é o processo infantil e o processo de execução é o processo pai. Considerando que a chamada do sistema EXEC () é usada para substituir uma imagem de processo por uma nova imagem de processo. Portanto, não há conceito de processos de pais e filhos na chamada do sistema EXEC ().
No sistema Fork () chamam os processos pai e filho são executados ao mesmo tempo. Mas na chamada do sistema EXEC (), se a substituição da imagem do processo for bem -sucedida, o controle não retornará para onde a função EXEC foi chamada, em vez de executar o novo processo. O controle só será transferido de volta se houver algum erro.
Exemplo 2: Combinando as chamadas do Fork () e Exec ()
Considere o exemplo a seguir, no qual usamos as chamadas do sistema Fork () e EXEC () no mesmo programa:
CÓDIGO:
#incluirCÓDIGO:
#incluirSAÍDA:
Pid de exemplo.c = 4790Neste exemplo, usamos a chamada do sistema Fork (). Quando o processo infantil for criado 0 será atribuído a P e depois mudaremos para o processo infantil. Agora o bloco de declarações com se (p == 0) será executado. Uma mensagem é exibida e usamos a chamada do sistema EXECV () e a imagem atual do processo filho, que é o exemplo.c será substituído por olá.c. Antes de Execv (), ligue para os processos infantis e pais eram iguais.
Pode -se ver que o pid de exemplo.c e olá.C é diferente agora. Isso é porque exemplo.C é a imagem do processo pai e olá.C é a imagem do processo infantil.