【问题标题】:How does Linux execute command insideLinux内部是如何执行命令的
【发布时间】:2019-09-11 02:40:37
【问题描述】:

我在谷歌面试的时候被问到这个问题,Linux/Unix是如何在里面执行你的输入命令的,流程是什么?

我知道 shell 没有为命令创建进程并使用 shell 进程,但它是如何工作的?当我们输入像cd这样的shell命令和像enable sshd sshd start这样的服务时,它有什么不同吗?

【问题讨论】:

  • 是的,它完全不同。 cd 是许多 shell 解释器的内置功能,因此操作发生在 shell 程序中(不涉及内核,除了读取目录内容等)。对于ssh(你提到过启动脚本吗?),它的作用要长得多。

标签: linux shell linux-kernel operating-system


【解决方案1】:

我知道shell没有为命令创建进程并使用shell进程,但是它是如何工作的呢?

您必须假定 shell 使用fork(2) 后跟exec(3) 创建一个新进程。碰巧你使用的shell有内置命令,然后实际上没有新进程。即,Bash 中的time 不执行/usr/bin/time,而是它自己的实现。

Linux/Unix是如何在里面执行你的输入命令的,程序是什么?

我不清楚“在内部执行输入命令”是什么意思。我会认为您是在询问 shell 如何将您在命令行中键入的参数传递给您的程序。

您正在生成的程序的完整命令行位于新的进程堆栈上。使用argv 指针到达它。每个交错的空间由\0 交换,这给了我们一个字符串(*)数组。 argc 是这个数组的大小。因此,main 原型可以是

int main(int argc, char *argv[]);

欲了解更多信息that is an excellent text about the stack layout in Linux

(*) 使用\" 时例外。示例:

$ echo hello world # broken into {"echo", "hello", "world"}
...
$ echo "hello world" # broken into {"echo", "hello world"}
...

当我们输入像 cd 这样的 shell 命令和像 enable sshd sshd start 这样的服务时,会有什么不同吗?

cd 通常作为内置命令实现;它只是通过调用chdir(2) 来更改工作目录。另一方面,sshd start 隐含在fork+exec 中(参见GNU Libc manual)。 exec 在某个时候会设置由fork 创建的新进程的堆栈,并将命令行字符串分配给argv

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2023-04-05
    • 2012-05-17
    • 2016-07-07
    • 2022-01-12
    相关资源
    最近更新 更多