本文来自博客。
原文链接:
这是本博客的第一个文章专辑。主要介绍如何用 C 语言基于系统来实现一个简单,DIY 一个。通过自己编程实现一个下的,可以使得个人对进程的概念、进程的通信和的运行的理解更加的深刻。还会大大增加个人学习的成就感,提供学习兴趣。
这一个文章专辑被命名为 ,这也是作者所实现的的名称,已经开源放到了 GitHub: 上,感兴趣的读者可以自行前去查看下载,也欢迎对该项目进行星标、提出改善建议、或者自行 fork 之后改善。
这是 StupidShell 专辑本章里的第二篇文章,主要介绍内建命令和外部命令,以及外部命令的实现方法。
内部命令
内部命令实际上是程序本身的一部分,通常都是一些比较简单的系统命令。这些命令所实现的功能与所做工作都是由程序本身来完成的,也就是在 shell 程序的源码里面实现的,其执行速度要比外部命令快很多,因为执行内部命令时,shell 无需创建新的进程产生多余的开销。常见的外部命令有:
exitcdecho
外部命令
外部命令区别于内建命令,通常是一些功能较为强大、复杂的命令。它由 shell 分析然后通过内核 API 创建新的进程,在新的进程中执行,在新的进程中所执行的代码是不属于 shell 的,所以在 shell 加载时并不随之一起被加载到内存中,而是在外部命令执行时才将其调入内存中。
例如,命令 ls ,它是一个列出当前工作目录下所有文件和文件夹的命令,但是实际上 ls 本身就是一个可执行二级制程序文件,通常存放在系统的/bin 文件夹下。shell 在执行该命令时是先创建一个新的子进程,然后把 ls 的可执行二级制程序文件加载到内存当中执行。常见的下 shell 外部命令有:
lscatmoregrep
外部命令的调用方法
外部命令在被调用时通常是通过所提供的 exe 函数族来完成的。exec 函数族的作用是根据指定的文件名和相关参数找到可执行文件,并用它来取代当前进程的内容。换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
exe 函数族有以下函数:
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[]);
本文来自博客。
原文链接: