我在 Linux 中编写一个基本的 shell 作为爱好,我想开始执行程序,但不知道如何做到这一点。我见过execp()
它的各种兄弟姐妹,但显然这迫使内核放弃当前正在运行的进程,在这种情况下是我的 shell,并继续使用新进程。
所以基本上我所需要的只是一个函数,我可以用它来调用命令,ls
或者cd
让它执行,然后返回到我的 shell。
感谢所有帮助。
ouah 的回答基本上是正确的,但它不适用于cd
. 您的 shell 需要将其实现为内置命令(即 shell 需要包含cd
.
这样做的原因是fork
首先创建当前进程的新副本(在本例中为 shell 的运行实例)。然后 exec 用您要运行的可执行文件覆盖新进程。当命令完成时,新进程终止并消失。如果您使用cd
它,它将更改新进程的工作目录,但保持旧进程(shell)的工作目录完全不变。
创建一个新进程,fork
然后调用exec
.
使用这样的东西:
if (fork ()==0) {
execl ("/bin/sh",NULL);
}
这将创建新进程(已经运行的进程的精确副本),然后用新进程替换它。请注意,在某些 CPU 不完全支持虚拟内存的环境中,这可能需要一些解决方法,并且您的原始进程太大以至于您无法复制它。