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