实现一个简单的shell(2)

本文来自TOMORROW 星辰博客。

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


  

  

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

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

 

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

    

内部命令

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

扫描二维码关注公众号,回复: 1462183 查看本文章
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)

   


猜你喜欢

转载自blog.csdn.net/limit1995/article/details/80529317