在 unix (Minix) 源代码中执行的 shell 命令在哪里?

Posted

技术标签:

【中文标题】在 unix (Minix) 源代码中执行的 shell 命令在哪里?【英文标题】:Where are shell commands executed inside the unix (Minix) source code? 【发布时间】:2021-12-07 21:43:09 【问题描述】:

我目前正在学习操作系统内核以及如何从源代码构建它们(我使用的是 Minix)。

我试图找出 shell 命令(例如 ls)在哪里执行。我知道在哪里可以找到 ls.c 文件 (src/bin/ls) 我只是不确定当用户在终端中键入它时它在哪里被调用。

我的目标是“劫持” ls 命令以完成不同的结果,而无需编辑命令文件本身 ls.c(例如,ls 命令现在关闭计算机或回显字符串)。为了做到这一点,我需要知道来自用户的文本在哪里被解析以及 ls 命令被执行。

我查看了源代码,我相信它位于进程管理器 (src/minix/servers/pm) 中,但是,这是我迷路之前所获得的。 p>

我知道这是一个非常具体的问题,但希望我能解决它。 提前致谢

【问题讨论】:

shell 将调用exec 系列函数之一来加载和执行程序。在尝试使用类 Unix 内核之前,请先了解更多关于 Unix 系统编程的知识。 如果要“劫持”,最简单的方法:使用shell别名,第二种最简单的方法:将/bin/ls移入/bin/ls.orig,在/下放一个命令或脚本bin/ls(在大多数情况下会自称为 /bin/ls.orig)。注意 shell 可以实现 ls 内置(对于最常见的情况)并且程序可以直接调用系统。 @GiacomoCatenazzi 确实,shell 内置函数帮助了 UNIX 历史上一些最神奇的恢复 :) 【参考方案1】:

您将两个不同的问题混合在一起:ls 二进制文件在哪里,其源代码在哪里。对于前一个问题,您可以使用which 来确定其绝对路径。例如,在我的 FreeBSD 机器上,which ls 输出 /bin/ls。但是ls是编译后的二进制文件,不修改源代码重新编译是不能轻易被“劫持”的,这是后面的问题。您已经确定了ls的正确路径:src/bin/ls,因此您需要根据需要修改ls.c并编译它,然后选择安装到您的系统中。我对 Minix 构建系统不太熟悉,但您可以随时查阅 Minix 文档以了解如何安装更新的用户空间程序。

【讨论】:

是的,对不起,如果我的问题有点令人困惑。 Ls 只是一个例子。我一直在寻找更多内容,并找到了我正在寻找的文件 (src/bin/sh/exec.c),它处理来自同一目录中 main.c 中的 cmdloop 函数的命令的执行。我澄清的问题是:将'ls ...'映射到ls.c的那种'字典'在哪里? shell如何解析我输入到命令中的文本? @Cyber​​boy1551 没有这样的“字典”可以将命令映射到源文件。你知道 C 源文件被编译链接成单独的可执行文件,然后与源文件完全无关? @Cyber​​boy1551 至于exec函数,它会寻找executable程序来加载和执行。我真的恳请您退后几步,先学习 C 编程的基础知识,然后再学习 Unix 系统编程的基础知识,然后再尝试在内核级别工作。 @Cyber​​boy1551 有字典映射。 shell首先将你的命令和参数解析成一个带有shell变量和控制语句的数组(这是一个复杂的过程)。例如,ls -al -h 被解析为ls["-al", "-h"] 的数组。然后,shell fork()exec(ls, <arg array>) 程序。 ls 的位置是使用 PATH 环境变量找到的。

以上是关于在 unix (Minix) 源代码中执行的 shell 命令在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Linux文件系统的演变

对Minix3中进程模型的简要分析

linux发展历史

Linux的学习笔记-linux的诞生

执行sh脚本文件下载Github上的代码(雷霄骅的ffmpeg示例代码)

如何在 Unix 中同时搜索和执行两个脚本?