我正在Linux中编写一个基本的shell作为业余爱好,我想开始编写程序执行程序,但不知道如何执行此操作。我见过execp()
及其各种兄弟姐妹,但显然这迫使内核放弃当前正在运行的进程,在这种情况下是我的shell,并继续进行新进程。从我的C程序执行不同的程序
所以基本上我需要的是一个函数,我可以用它来调用一个命令,如ls
或cd
让它执行然后返回到我的shell。
所有帮助表示赞赏。
我正在Linux中编写一个基本的shell作为业余爱好,我想开始编写程序执行程序,但不知道如何执行此操作。我见过execp()
及其各种兄弟姐妹,但显然这迫使内核放弃当前正在运行的进程,在这种情况下是我的shell,并继续进行新进程。从我的C程序执行不同的程序
所以基本上我需要的是一个函数,我可以用它来调用一个命令,如ls
或cd
让它执行然后返回到我的shell。
所有帮助表示赞赏。
用fork
创建一个新流程,然后致电exec
。
使用这样的事情:
if (fork()==0) {
execl ("/bin/sh",NULL);
}
这将创建新的进程(已经在运行一个完全相同的副本),然后用新的替换它。 请注意,在CPU不能完全支持虚拟内存的某些环境中,这可能需要一些解决方法,并且您的原始进程非常大以至于无法复制它。
这将打印新过程的输出,在您的情况下'/ bin/sh'到STDOUT? – 2012-08-03 11:00:47
是的,新运行的进程(即STDOUT和STDIN)的控制台将与原始进程相同。 – Senna 2012-08-03 11:03:43
好吧,它似乎有点工作。 我在调用该函数时出现此错误。 NULL argv [0]通过exec系统调用传递。 这是从'execl()'函数调用'ls'命令... – 2012-08-03 11:10:12
ouah的答案基本上是正确的,但它不适用于cd
。你的shell需要实现作为内置命令(即shell需要包含代码cd
原因是fork
首先创建当前进程的新副本(shell的运行实例,然后exec用你想要运行的可执行文件覆盖新进程,当命令结束时,新进程终止并消失,如果你使用cd
这将改变新进程的工作目录,但离开旧的进程(shell)的工作目录完全没有触动
啊我明白你的意思了。然后我会对'fork()'函数做更多的研究。 – 2012-08-03 11:12:06
好的,所以创建我的shell的新实例或只是一个简单的程序使用'fork',然后在那个过程中调用'exec'函数? 如果是这样,我不敢相信我没有想到! 谢谢。 – 2012-08-03 10:59:05
您先分叉,然后使用exec来调用所需的命令。请注意,这对'cd'不起作用。 – JeremyP 2012-08-03 11:00:44
好的,谢谢,我会再提一些建议,然后测试每种方法。 – 2012-08-03 11:01:52