2012-08-03 24 views
-1

我正在Linux中编写一个基本的shell作为业余爱好,我想开始编写程序执行程序,但不知道如何执行此操作。我见过execp()及其各种兄弟姐妹,但显然这迫使内核放弃当前正在运行的进程,在这种情况下是我的shell,并继续进行新进程。从我的C程序执行不同的程序

所以基本上我需要的是一个函数,我可以用它来调用一个命令,如lscd让它执行然后返回到我的shell。

所有帮助表示赞赏。

回答

1

fork创建一个新流程,然后致电exec

+0

好的,所以创建我的shell的新实例或只是一个简单的程序使用'fork',然后在那个过程中调用'exec'函数? 如果是这样,我不敢相信我没有想到! 谢谢。 – 2012-08-03 10:59:05

+0

您先分叉,然后使用exec来调用所需的命令。请注意,这对'cd'不起作用。 – JeremyP 2012-08-03 11:00:44

+0

好的,谢谢,我会再提一些建议,然后测试每种方法。 – 2012-08-03 11:01:52

1

使用这样的事情:

if (fork()==0) { 
    execl ("/bin/sh",NULL); 
} 

这将创建新的进程(已经在运行一个完全相同的副本),然后用新的替换它。 请注意,在CPU不能完全支持虚拟内存的某些环境中,这可能需要一些解决方法,并且您的原始进程非常大以至于无法复制它。

+0

这将打印新过程的输出,在您的情况下'/ bin/sh'到STDOUT? – 2012-08-03 11:00:47

+0

是的,新运行的进程(即STDOUT和STDIN)的控制台将与原始进程相同。 – Senna 2012-08-03 11:03:43

+0

好吧,它似乎有点工作。 我在调用该函数时出现此错误。 NULL argv [0]通过exec系统调用传递。 这是从'execl()'函数调用'ls'命令... – 2012-08-03 11:10:12

2

ouah的答案基本上是正确的,但它不适用于cd。你的shell需要实现作为内置命令(即shell需要包含代码cd

原因是fork首先创建当前进程的新副本(shell的运行实例,然后exec用你想要运行的可执行文件覆盖新进程,当命令结束时,新进程终止并消失,如果你使用cd这将改变新进程的工作目录,但离开旧的进程(shell)的工作目录完全没有触动

+0

啊我明白你的意思了。然后我会对'fork()'函数做更多的研究。 – 2012-08-03 11:12:06