用于进程创建的 UNIX 系统调用 fork() 通过复制父进程来创建子进程。我的理解是,这之后几乎总是调用 exec() 来替换子进程的内存空间(包括文本段)。在 fork() 中复制父级的内存空间对我来说总是很浪费(尽管我意识到可以通过使内存段在写时复制从而只复制指针来最小化浪费)。无论如何,有谁知道为什么流程创建需要这种复制方法?
我有一个关于执行简单命令的简单问题。根据我的理解,当我们ls在交互式 shell 中键入命令时,
如果我的理解是正确的,我们在 shell 提示符下键入的一个简单命令会在子进程上执行,并且该命令的结果不会影响当前 shell 的环境。
如果是这样,那么内置命令cd呢?如果cd在子进程上执行并且不能影响当前shell的环境,那么如何更改当前shell的工作目录?
我没有太多经验,只是试图参与他们如何从用户级别解释到硬件的过程。
因此,当从 shell 触发命令时,fork()继承它exec()的子进程并将子进程加载到内存中并执行。
fork和exec概念是否适用于 UNIX 中的所有可执行程序?也喜欢shell脚本还是只喜欢命令?它是否也适用于 shell 内置命令?很抱歉一次问了很多问题,但是当我想到任何命令执行时,所有这些问题都会立刻浮现在我的脑海中。
我从现代操作系统一书中读到,当一个命令运行时,shell 创建一个子进程,等待它直到子进程完成执行,然后等待来自用户的另一个命令。对于像gedit. 终端在我关闭之前不会接受命令gedit。但是,当我打开atom代码编辑器时,shell 立即返回,即使编辑器正在运行,也准备好接受下一个命令。关闭终端不会关闭原子。这是否意味着编辑器不是作为子进程打开的?使这成为可能的潜在机制是什么?
跑步ps au | grep atom给予
<username> 8042 0.0 0.0 15944 2264 pts/1 S+ 00:55 0:00 grep --color=auto atom
Run Code Online (Sandbox Code Playgroud)