首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用execl()替换当前shell

用execl()替换当前shell
EN

Unix & Linux用户
提问于 2018-07-09 13:00:10
回答 1查看 1.4K关注 0票数 2

在以下C程序中:

代码语言:javascript
运行
复制
#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)

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-07-09 13:05:01

execl()不应该用一个新的shell替换当前的shell (而不是在旧的shell中生成一个新的shell)吗?

它取代当前进程,即运行程序的进程,而不是shell。

启动程序时,进程树看起来就像

代码语言:javascript
运行
复制
old shell → your program

当程序调用execl()时,该树将变为

代码语言:javascript
运行
复制
old shell → new shell

因此,当您退出shell时,您将返回到旧的shell。

如果要替换旧的shell,则需要告诉旧shell用新程序替换自己:

代码语言:javascript
运行
复制
exec ./yourprogram

然后,您的程序将用新的shell替换自己,您将用新的shell替换旧的shell(使用包含您的程序的额外步骤)。

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/454295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档