substituindo o shell atual por execl ()

1

No seguinte programa C:

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

int     main(void){
        char *shell = getenv("SHELL");
        execl(shell, NULL, NULL);
        perror("execl() failed");
}

Quando eu corro o acima, eu me encontro dentro de um novo shell. Quando eu digito exit , o novo shell sai e eu me encontro de volta no meu antigo shell.

O execl() não deveria substituir o shell atual por um novo shell (e não gerar um novo shell dentro do shell antigo)?

(Linux 4.16)

    
por bliako 09.07.2018 / 15:00

1 resposta

5

Shouldn't execl() replace the current shell with a new shell (and not spawn a new shell inside the old shell)?

Ele substitui o processo atual, que é o processo que executa seu programa, não o shell.

Quando você inicia seu programa, a árvore de processos se parece com

old shell → your program

Quando seu programa chama execl() , essa árvore se torna

old shell → new shell

então quando você sair do shell, você retornará ao shell antigo.

Se você quiser substituir o shell antigo, você precisa dizer ao shell antigo para substituir a si mesmo pelo seu novo programa:

exec ./yourprogram

Em seguida, seu programa substituirá o novo shell, e você terá substituído o shell antigo pelo novo (com uma etapa extra envolvendo seu programa).

    
por 09.07.2018 / 15:05

Tags