实现一个简单的shell(2)

本文来自TOMORROW 星辰博客。

原文链接:DIY Shell之——内建命令与外部命令(2)


  

  

这是本博客的第一个文章专辑。主要介绍如何用 C 语言基于Linux系统来实现一个简单shell,DIY 一个shell。通过自己编程实现一个Linux下的shell,可以使得个人对进程的概念、进程的通信和操作系统的运行的理解更加的深刻。还会大大增加个人学习的成就感,提供学习兴趣。

这一个文章专辑被命名为 StupidShell ,这也是作者所实现的shell的名称,已经开源放到了 GitHub:StupidShell 代码仓 上,感兴趣的读者可以自行前去查看下载,也欢迎对该项目进行星标、提出改善建议、或者自行 fork 之后改善。

 

这是 StupidShell 专辑本章里的第二篇文章,主要介绍内建命令和外部命令,以及外部命令的实现方法。

    

内部命令

内部命令实际上是shell程序本身的一部分,通常都是一些比较简单的系统命令。这些命令所实现的功能与所做工作都是由shell程序本身来完成的,也就是在 shell 程序的源码里面实现的,其执行速度要比外部命令快很多,因为执行内部命令时,shell 无需创建新的进程产生多余的开销。常见的外部命令有:

1
2
3
exit
cd
echo

  

外部命令

外部命令区别于内建命令,通常是一些功能较为强大、复杂的命令。它由 shell 分析然后通过Linux内核 API 创建新的进程,在新的进程中执行,在新的进程中所执行的代码是不属于 shell 的,所以在 shell 加载时并不随之一起被加载到内存中,而是在外部命令执行时才将其调入内存中。

例如,命令 ls ,它是一个列出当前工作目录下所有文件和文件夹的命令,但是实际上 ls 本身就是一个可执行二级制程序文件,通常存放在系统的/bin 文件夹下。shell 在执行该命令时是先创建一个新的子进程,然后把 ls 的可执行二级制程序文件加载到内存当中执行。常见的Linux下 shell 外部命令有:

1
2
3
4
ls
cat
more
grep

   

外部命令的调用方法

外部命令在被调用时通常是通过Linux操作系统所提供的 exe 函数族来完成的。exec 函数族的作用是根据指定的文件名和相关参数找到可执行文件,并用它来取代当前进程的内容。换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。

exe 函数族有以下函数:

1
2
3
4
5
6
int  execl( const  char  *path,  const  char  *arg, ...);
int  execlp( const  char  *file,  const  char  *arg, ...);
int  execle( const  char  *path,  const  char  *arg, ...,  char  * const  envp[]);
int  execv( const  char  *path,  char  * const  argv[]);
int  execvp( const  char  *file,  char  * const  argv[]);
int  execve( const  char  *path,  char  * const  argv[],  char  * const  envp[]);

 

 

 

本文来自TOMORROW 星辰博客。

原文链接:DIY Shell之——内建命令与外部命令(2)

   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值