起因

闲来无事时通常会打开 github/trending 看看当前大家热门的项目是什么,同时也希望看到自己感兴趣的项目,以此来提高自己。这天,突然看到了一个名为《程序员应该访问的最佳网站中文版》,里面有一 part 是《bash和bash脚本》,这种程序员+生产力相关内容是我最感兴趣的类目之一了,点进去浏览了一会。突然一个历史遗留的模糊问题又浮现在了我的脑海:shell 和 bash 是什么关系?。虽说之前也曾整理过这个问题,但是禁不住时间的洗礼,这不又得百度一下。搜到了《Shell是什么?1分钟理解Shell的概念!》,里面有句话:

我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核。接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。

这句话对我来说太有用了。简直是盘古开天辟地,把我脑海中的混沌,一下辟成两半,清澈起来了。以至于我还哪管什么是 shell,什么是 bash,赶紧借这句话进一步理清一下内核、系统调用、shell 等之间的关系。

man 手册

从哪开始理呢?首先想到的是 man 手册,man 手册共分 8 部分,如下:

1  Executable programs or shell commands
2  System calls (functions provided by the kernel)
3  Library calls (functions within program libraries)
4  Special files (usually found in /dev)
5  File formats and conventions eg /etc/passwd
6  Games
7  Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8  System administration commands (usually only for root)

审视了十秒钟,感觉哪里不对劲,突然恍然大悟,怎么把 可执行程序和 shell 命令 放在了第一页,应该把 系统调用 放在第一页才符合从底层到上层的排列顺序嘛,怪不得我之前用了好久才记住 1 2 3 分别代表哪部分的内容,原来是不符合习惯呀(终于找到借口了)。为了确认自己的观点,打开了《UNIX环境高级编程第二版》,UNIX 操作系统的体系结构图了然如下:

结合这张图,所以我建议 man 手册 的前 3 部分排序改为如下:

1  System calls (functions provided by the kernel)
2  Library calls (functions within program libraries)
3  Executable programs or shell commands

即:

1  系统调用(内核提供的函数接口)
2  库函数 (建立在系统调用之上的公用函数库,应用软件既可以使用公用函数库,也可以使用系统调用)
3  可执行程序或 shell 命令

怀疑 UNIX 操作系统体系结构的准确性

自己私自调整 man 手册 的前 3 部分排序后,心中不由窃喜。突然,又有一个细节引起了我的思考,为什么 可执行程序或 shell 命令 要排在 库函数 的后面,这样排序得依据 shell 命令必须使用了库函数 这个理由才行,再仔细看看上面那张 UNIX 的体系结构图,貌似 shell库函数 是平级的。并没有调用关系,难道事实真的是这样吗?

源码验证

下载 coreutils-5.0 源码。其实看 busybox 源码也一样,不过个人感觉 coreutils 更经典一些。

coreutils 是GNU下的一个软件包,包含linux下的 ls 等常用命令。 —— 百度百科

随便找一个,就看我们最熟悉的 ls 吧,打开 ls.c,部分代码如下(仅保留我们关心的部分):

/* Read directory `name', and list the files in it.If `realname' is nonzero, print its name instead of `name';this is used for symbolic links to directories. */static void
print_dir(const char *name, const char *realname)
{...dirp = opendir(name);if (!dirp){error(0, errno, "%s", quotearg_colon(name));exit_status = 1;return;}if (LOOP_DETECT){struct stat dir_stat;int fd = dirfd(dirp);/* If dirfd failed, endure the overhead of using stat.  */if ((0 <= fd? fstat(fd, &dir_stat): stat(name, &dir_stat)) < 0){error(0, errno, _("cannot determine device and inode of %s"),quotearg_colon(name));exit_status = 1;return;}DEV_INO_PUSH(dir_stat.st_dev, dir_stat.st_ino);}...if (files_index)print_current_files();
}int
main (int argc, char **argv)
{...while (pending_dirs){thispend = pending_dirs;pending_dirs = pending_dirs->next;if (LOOP_DETECT){if (thispend->name == NULL){/* thispend->name == NULL means this is a marker entryindicating we've finished processing the directory.Use its dev/ino numbers to remove the correspondingentry from the active_dir_set hash table.  */struct dev_ino di = dev_ino_pop();struct dev_ino *found = hash_delete(active_dir_set, &di);/* ASSERT_MATCHING_DEV_INO (thispend->realname, di); */assert(found);dev_ino_free(found);free_pending_ent(thispend);continue;}}print_dir(thispend->name, thispend->realname);free_pending_ent(thispend);print_dir_name = 1;}...exit (exit_status);
}

可以看到,ls 命令的源码中,

  • 既包含 系统调用 ,如:stat()、fstat(),所在头文件 <sys/stat.h>
  • 又包含 库函数,如:opendir(),所在头文件 <dirent.h>

UNIX 操作系统体系结构调整

所以,我又发现了《UNIX 环境高级编程第二版》中的一处不合理的地方(个人认为)。遂将结构更改为如下:

UNIX 操作系统体系结构调整相关推荐

  1. Redox随笔(1)-用Rust语言编写的类UNIX操作系统

    Redox是一个用Rust语言编写的类UNIX操作系统 , 它的目标是把Rust语言的创新带入到一个现代的微内核和全系列的应用程序. https://www.redox-os.org/zh/docs/ ...

  2. 计算机系统结构实验报告Linux,计算机操作系统体系结构实验报告.doc

    操作系统实验报告 实验目的: 随着操作系统应用领域的扩大,以及操作系统硬件平台的多样化,操作系统的体系结构和开发方式都在不断更新,目前通用机上常见操作系统的体系结构有如下几种:模块组合结构.层次结构. ...

  3. unix操作系统(360搜索百科)介绍unix系统产生的由来和发展是重点,而百度百科中没有仔细介绍这方面

    unix操作系统 免费编辑 添加义项名 B 添加义项 ? 所属类别 : 软件 UNIX操作系统(尤尼斯),是一个强大的多用户.多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统, ...

  4. Unix操作系统背后的女程序员Lorinda Cherry去世,享年78岁

    作者 | 丁广辉       责编 | 张红月 出品 | CSDN(ID:CSDNnews) Unix是一个强大的多用户,多进程,支持多种处理器架构的操作系统,按照操作系统的分类,属于分时操作系统.它 ...

  5. 初探 Unix 操作系统

    在互联网公司里面,基本大大小小所有的服务器端应用程序都是部署在 Linux 服务器上面.由于之前在外企工作,开发的应用程序需要依赖于 Windows 的 API,因此程序都是部署在 Windows S ...

  6. eq linux_在线试用 200 多种 Linux 和 Unix 操作系统 | Linux 中国

    只要打开该网站,选择你需要的 Linux/Unix 发行版,然后开始试用!-- Sk 不久前我们介绍过OSBoxes,该网站提供了一系列免费且开箱即用的 Linux 和 Unix 虚拟机.你可以在你的 ...

  7. menuetos oracle,使用DistroTest服务免费在线测试Linux和Unix操作系统

    本文教你免费在线测试Linux和Unix操作系统的方法,使用名为DistroTest的服务,它与OSBoxes不同,DistroTest允许你免费试用实时Linux和Unix操作系统,你可以在线测试2 ...

  8. 2 操作系统第一章 操作系统体系结构、中断和异常、系统调用

    文章目录 1.1 指令概念及其分类 1.2 操作系统体系结构: 1.2.1操作系统内核概念 1.3 中断和异常 1.3.1 中断的诞生 1.3.2 中断分类 1.3.3 外中断的处理过程 1.3.4 ...

  9. linux 启动一个网站_在线试用 200 多种 Linux 和 Unix 操作系统

    只要打开该网站,选择你需要的 Linux/Unix 发行版,然后开始试用! -- Sk(作者) 不久前我们介绍过 OSBoxes ,该网站提供了一系列免费且开箱即用的 Linux 和 Unix 虚拟机 ...

  10. FreeBSD是一种UNIX操作系统

    FreeBSD是一种UNIX操作系统,是由经过BSD.386BSD和4.4BSD发展而来的Unix的一个重要分支.FreeBSD 为不同架构的计算机系统提供了不同程度的支持. 目录 简介 许可协议 发 ...

最新文章

  1. 第三次作业:阅读《构建之法》1-5章有感
  2. boost::type_erasure::tuple相关的测试程序
  3. spoj1026 favorite dice
  4. 如何生成全局唯一标识
  5. 高颜值可定制在线作图工具-第二版
  6. 电脑一直弹出传奇游戏网页弹窗怎么办
  7. python时间处理,datetime中的strftime/strptime
  8. SpringNet整合NHibernate相关配置
  9. 开方 C语言 迭代法加二分法
  10. 基于Github Actions + Docker + Git 的DevOps方案实践教程
  11. 路由基本配置(接口设置ip地址)
  12. PPT中如何插入指定大小的矩阵
  13. 在线副业教程之 02 你学的越多,你赚的越多+你必须开始学习的5个最好的在线副业
  14. Mall商城后台管理系统——(Vue+SSM)
  15. 爬虫------爬取搜狗图片
  16. Unittest简单项目
  17. MySQL-- ADD COLUMN 添加多个字段的写法
  18. 猜数字游戏c语言原理二进制,第一个c语言实现的猜数字游戏
  19. SiteMesh 2学习(1):入门简介和简单实例
  20. 嵌入式计算机与pc机区别,嵌入式工控主板与计算机pc主板的区别是什么

热门文章

  1. mach-O文件结构分析
  2. angular.injector()
  3. 学有小成-php基础语法-06
  4. JavaScript事件委托的技术原理
  5. HDU 1017 A Mathematical Curiosity 数学题
  6. 【C语言】19-static和extern关键字1-对函数的作用
  7. 数据挖掘:Bloom filter
  8. 什么是随机存取_内存条的时序是什么?
  9. php有序数组合并,使用Python怎么合并两个有序数组
  10. win10家庭版 mysql_win10家庭版64位下mysql 8.0.15 安装配置方法图文教程