使用exec在新进程中执行系统命令

我试图产生一个执行系统命令的进程,而我自己的程序仍在继续,两个进程将并行运行。 我正在linux上工作。

我在网上查询,听起来像我应该使用exec()家庭。 但是它不能像我所期望的那样工作。 例如,在下面的代码中,我只看到“之前”被打印,而不是“完成”。

我很好奇,如果我什么都没有问题?

#include <unistd.h> #include <iostream> using namespace std; main() { cout << "before" << endl; execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", (char *) 0); cout << "done" << endl; } 

[UPDATE]

谢谢你们的评论。 现在我的程序看起来像这样。 一切工作正常,除了最后,我不得不按下完成程序。 我不知道为什么我要按最后input?

 #include <unistd.h> #include <iostream> using namespace std; main() { cout << "before" << endl; int pid = fork(); cout << pid << endl; if (pid==0) { execl("/bin/ls", "ls", "-r", "-t", "-l", (char *) 0); } cout << "done" << endl; } 

你错过了对fork的调用。 所有exec所做的就是新程序替换当前的过程映像 。 使用fork来生成当前进程的副本。 它的返回值会告诉你是否是孩子或正在运行的原始父代。 如果是小孩,请致电exec


一旦你做了这个改变,它只显示你需要按下Enter键才能完成程序。 实际发生的情况是:父进程分叉并执行子进程。 两个进程都运行,并且这两个进程同时打印到stdout。 他们的输出是乱码。 父母的过程比孩子少,所以它首先结束。 当它终止时,正在等待它的shell会唤醒并打印通常的提示符。 同时,子进程仍在运行。 它打印更多的文件条目。 最后,它终止。 shell不关注子进程(其孙子),所以shell没有理由重新打印提示符。 仔细看看你得到的输出,你应该能够找到埋在上面ls输出中的通常的命令提示符。

光标似乎在等待你按下一个键。 当你这样做的时候,shell会打印一个提示,而且看起来都很正常。 但就壳而言,一切都已经是正常的了。 你以前可以输入另一个命令。 这看起来有点奇怪,但shell通常会执行它,因为它只接收来自键盘的输入,而不是从子进程向打印屏幕添加额外的字符。

如果在单独的控制台窗口中使用top程序,则可以观察并确认两个程序已经完成运行,然后按Enter键。

Exec系列函数用新的可执行文件替换当前进程。

要做你所需要的,使用其中一个fork()函数,让子进程exec新的镜像。

[回复更新]

这正是你所说的:你不必按“进入”来完成程序:它已经退出。 shell已经给出提示:

 [wally@zenetfedora ~]$ ./z before 22397 done [wally@zenetfedora ~]$ 0 << here is the prompt (as well as the pid) total 5102364 drwxr-xr-x. 2 wally wally 4096 2011-01-31 16:22 Templates ... 

ls的输出需要一段时间,所以它会隐藏提示。 如果您希望输出以更合理的顺序出现,请在“完成”之前添加sleep(1) (或者更长时间)。

您错过了execl()用/bin/ls替换当前程序的部分

我会建议看看popen() ,它将fork和exec一个新的进程,然后让你通过管道读取或写入。 (或者如果你需要读写fork() ,那么exec()