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

标签 c++ linux process parallel-processing 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;
}

[更新]

感谢你们的评论。现在我的程序看起来像这样。一切正常,除了最后,我必须按 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 生成当前进程的拷贝。它的返回值会告诉你运行的是 child 还是原来的 parent 。如果是 child ,请调用 exec


一旦您进行了更改,它只会显示您需要按 Enter 键才能完成程序。实际情况是这样的:父进程 fork 并执行子进程。两个进程都运行,并且两个进程同时打印到标准输出。他们的输出是乱码。父进程比子进程要做的事少,所以它先终止。当它终止时,正在等待它的 shell 将唤醒并打印通常的提示。同时,子进程仍在运行。它打印更多的文件条目。最后,它终止。 shell 没有注意子进程(它的孙子进程),所以 shell 没有理由重新打印提示。仔细查看你得到的输出,你应该能够在上面的 ls 输出中找到你常用的命令提示符。

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

如果您在单独的控制台窗口中使用像 top 这样的程序,您可以在必须按 Enter 之前观察并确认两个程序已经运行完毕。

关于c++ - 使用 exec 在新进程中执行系统命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5631229/

相关文章:

c++ - 游戏逻辑的异步屏幕更新,C++

c++ - 从 const char 到 char 的无效转换 - 元音删除

linux - 使用 fail2ban 在 Ubuntu 8.04 上安装 vsftp 后连接被拒绝

c# - 如何使用c#制作完整文件夹的rar文件

java - 在 Java 中,将命令发送到另一个命令行程序

c++ - 在 Linux 中使用 C++ 在给定路径创建文件

c++ - SDL_Mixer 是否可以在自身上播放单个 block ?

php - 奇怪的网络服务器问题

linux - 记录导致主要页面错误的内存访问

linux - 如何在 Linux 上使用 clone() 创建一个真正的线程?