在以下C程序中:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void){
char *shell = getenv("SHELL");
execl(shell, NULL, NULL);
perror("execl() failed");
}
当我运行上面的代码时,我发现自己在一个新的shell中。当我输入exit
时,新的shell退出,我发现自己回到了原来的shell中。
execl()
不应该用一个新的shell替换当前的shell (而不是在旧的shell中生成一个新的shell)吗?
(Linux 4.16)
发布于 2018-07-09 13:05:01
execl()
不应该用一个新的shell替换当前的shell (而不是在旧的shell中生成一个新的shell)吗?
它取代当前进程,即运行程序的进程,而不是shell。
启动程序时,进程树看起来就像
old shell → your program
当程序调用execl()
时,该树将变为
old shell → new shell
因此,当您退出shell时,您将返回到旧的shell。
如果要替换旧的shell,则需要告诉旧shell用新程序替换自己:
exec ./yourprogram
然后,您的程序将用新的shell替换自己,您将用新的shell替换旧的shell(使用包含您的程序的额外步骤)。
https://unix.stackexchange.com/questions/454295
复制相似问题