在以下 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)
答案1
不应该
execl()
用新的 shell 替换当前的 shell(并且不在旧的 shell 中生成新的 shell)?
它替换当前进程,即运行程序的进程,而不是 shell。
当您启动程序时,进程树看起来像
old shell → your program
当你的程序调用时execl()
,那棵树就变成了
old shell → new shell
因此,当您退出 shell 时,您将返回到旧 shell。
如果你想替换旧的 shell,你需要告诉旧的 shell 用你的新程序替换它自己:
exec ./yourprogram
然后,您的程序将用新的 shell 替换自身,并且您将用新的 shell 替换旧的 shell(涉及您的程序的额外步骤)。