用 execl() 替换当前 shell

用 execl() 替换当前 shell

在以下 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(涉及您的程序的额外步骤)。

相关内容