2010-08-12 43 views
1

当我们在Unix Shell的提示符下输入vi时,我们可以使用Vim编辑器。关于进程修改和地址空间

现在壳牌推出另一个流程。

AFAIk我读了一本书,一个进程不能修改其他。 那么怎么在Linux下Shell允许我们在终端本身打开Vim呢?

我很困惑,如果shell实际上访问Vim的地址空间或不。

回答

0

有在Unix下只有一种方式来启动一个用户进程 - 在fork(2)系统调用。它创建调用过程的精确副本,区别在于父进程/调用者中新进程的调用进程ID(pid)的返回值,子进程中为零。操作系统通过父进程ID属性(请参阅输出ps -f)来维护此父子关系。

台前幕后会发生什么情况是,OS内核重复呼叫者的整个虚拟内存空间(有很多细节,谷歌的写入时复制页面映射和vfork)。除非通过共享内存机制(如mmap(2))专门设置,否则不能直接从一个地址空间访问另一个地址空间。父进程可以wait(2)让孩子终止。

我不打算进入process groupssessions和控制终端。这需要一张好照片。请仔细查看,例如APUE book以获取详细说明。

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

现在所述壳具有其stdinstdout,和stderr连接到terminal emulator,从login(1)进程继承在控制台上,或动态地由网络守护程序像sshd分配,或窗口管理器(X)。当你在shell中键入vi时,那么fork s,然后exec s /bin/vi程序,然后wait s。新进程继承了打开的文件描述符,并且能够通过它们通过ioctl(2)操纵终端伪设备。

乐趣实际上管道开始,当你喜欢ps -ef|grep bash输入的东西 - 那就是作为练习留给读者:)

我掩盖了许多有趣的细节在这里,但希望这能有点帮助作为简要介绍。

0

shell简单地将Vim的终端文件描述符连接到自己的终端文件,并通过数据传递。

您可能听说过“标准输入”,“标准输出”等文件描述符。当使用终端仿真程序(如XTerm或任何您使用的)时,它提供运行在其中的外壳,并接收它的键击流,并解释外壳发送到终端的数据(颜色等)并显示它们。

当你启动Vim时,shell会启动它的进程,并为它自己提供一个输入和输出流。输入流与shell接收的输入流相同,也就是说,终端上输入的所有内容都被shell接收,然后发送给Vim。 Vim发送到它的输出流的所有东西都被shell接收,然后发送到终端。

基本上,数据的双向流动是这样的:

terminal emulator <====> shell <====> vim 
+1

请详细说明,会有帮助! – Sadique 2010-08-12 18:09:11

+0

不完全正确。外壳不会“传递”任何东西来回。它执行fork(2),然后执行execve(2)来启动一个进程。 'fork(2)'系统调用让子进程*继承*打开文件描述符,'execve(2)'让它们为新的进程映像打开。 – 2010-08-12 18:23:00

+0

@Xaero,“修改过程”的含义是什么? – 2010-08-12 18:31:45