代码之家  ›  专栏  ›  技术社区  ›  Sadique

关于过程修改和地址空间

  •  1
  • Sadique  · 技术社区  · 15 年前

    当我们打字时 不及物动词 在unix shell的提示下, 我们可以使用VIM编辑器。

    现在,壳分叉了另一个过程。

    我在一本书中读到,一个过程不能改变另一个过程。 那么,在Linux中,shell为什么允许我们在终端本身中打开vim呢?

    我对这样一个事实感到困惑:如果shell真的在访问vim的地址空间,或者没有。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Nikolai Fetissov    15 年前

    在Unix中,启动用户进程的方法只有一种- fork(2) 系统调用。它创建调用进程的精确副本,不同之处在于调用进程ID的返回值。( pid )父进程/调用程序中的新进程,子进程中为零。操作系统通过 父进程ID 属性(例如,请参见 ps -f )

    幕后发生的是操作系统内核 复制品 调用者的整个虚拟内存空间(这里有更多详细信息,Google用于copy-on-write页面映射和 vfork )除非通过 共享内存 类机制 mmap(2) . 父进程可以 wait(2) 让它的孩子们终止。

    我不会去的 process groups , sessions 以及控制终端。这需要一张好照片。看,说, APUE book 为了彻底的解释。

    这个 execve(2) 系统调用 替换当前进程图像 文件中的某个可执行文件。

    现在贝壳有了 stdin , stdout stderr 连接到 terminal emulator ,继承自 login(1) 在控制台上处理,或由网络守护进程动态分配,如 sshd 或窗口管理器(X)。当你打字时,比如说, vi 在壳里,它 fork S然后 exec S /bin/vi 然后程序 wait 是的。新进程继承了打开的文件描述符,并且能够通过它们操纵终端伪设备 ioctl(2) .

    真正的乐趣始于 管道 ,当您键入类似 ps -ef|grep bash -这是留给读者的练习:)

    我在这里详细介绍了许多有趣的细节,但希望这能作为一个简短的介绍有所帮助。

        2
  •  0
  •   scy    15 年前

    shell只需将VIMS终端文件描述符连接到它的所有者,并通过它传递数据。

    您可能听说过文件描述符,比如标准输入、标准输出等等。当使用终端仿真器(如xterm或您使用的任何东西)时,它会向运行在它内部的shell提供它接收到的击键流,并解释shell发送到终端的数据(颜色等)并显示它们。

    当您启动VIM时,shell启动其进程,并为该进程单独提供输入和输出流。输入流与shell接收的相同,即,在终端上键入的所有内容都被shell接收,然后shell将其发送到vim。VIM发送到其输出流中的所有内容都由shell接收,然后发送到终端。

    基本上,双向数据流如下所示:

    terminal emulator <====> shell <====> vim