我正在尝试生成一个执行系统命令的进程,而我自己的程序仍然继续运行,并且两个进程将并行运行。我在linux上工作。
我在网上查了一下,听起来应该使用exec()系列。但这并不完全符合我的预期。例如,在下面的代码中,我只看到“ before”被打印,而没有看到“ done”。
我很好奇我是否在撒东西?
#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; }
[更新]
谢谢你们的评论。现在我的程序看起来像这样。除了最后,一切正常,我必须按Enter键才能完成程序。我不确定为什么必须按最后一个输入?
#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。
fork
exec
一旦你做出改变,它只是 看起来 ,你需要按下Enter键完成的程序。实际情况是这样的:父进程派生并执行子进程。两个进程都运行,并且两个进程同时打印到标准输出。他们的输出是乱码。父进程的工作量少于子进程,因此它首先终止。当它终止时,正在等待它的外壳程序将唤醒并显示通常的提示。同时,子进程仍在运行。它打印更多文件条目。最后,它终止。外壳程序不关注子进程(其子进程),因此外壳程序没有理由重新打印提示。仔细查看获得的输出,您应该能够找到隐藏在命令行中的常用命令提示符。ls 输出上面。
ls
光标 似乎 正在等待您按下一个键。当您这样做时,外壳程序会显示一个提示,并且一切看起来都很正常。但是就外壳而言,一切已经很正常了。您之前可能已经键入了另一个命令。看起来有些奇怪,但是Shell会正常执行它,因为它只从键盘接收输入,而不是从子进程中向屏幕打印其他字符的输入。
如果top在单独的控制台窗口中使用类似的程序,则可以在必须按Enter之前观察并确认这两个程序已经完成运行。
top