我正在尝试生成一个执行系统命令的进程,而我自己的程序仍然继续运行,并且两个进程将并行运行。我在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
。
一旦你做出改变,它只是 看起来
,你需要按下Enter键完成的程序。实际情况是这样的:父进程派生并执行子进程。两个进程都运行,并且两个进程同时打印到标准输出。他们的输出是乱码。父进程的工作量少于子进程,因此它首先终止。当它终止时,正在等待它的外壳程序将唤醒并显示通常的提示。同时,子进程仍在运行。它打印更多文件条目。最后,它终止。外壳程序不关注子进程(其子进程),因此外壳程序没有理由重新打印提示。仔细查看获得的输出,您应该能够找到隐藏在命令行中的常用命令提示符。ls
输出上面。
光标 似乎
正在等待您按下一个键。当您这样做时,外壳程序会显示一个提示,并且一切看起来都很正常。但是就外壳而言,一切已经很正常了。您之前可能已经键入了另一个命令。看起来有些奇怪,但是Shell会正常执行它,因为它只从键盘接收输入,而不是从子进程中向屏幕打印其他字符的输入。
如果top
在单独的控制台窗口中使用类似的程序,则可以在必须按Enter之前观察并确认这两个程序已经完成运行。
我正在处理我的一个项目。我正在windows机器上使用XAMPP开发该项目。这就是我面临的问题。我需要在服务器上执行shell脚本,并在网页上显示结果。问题是,大多数脚本都按预期运行,但我无法获得以下命令的输出:, ls, cat, pwd 因为这些命令返回给我一个空白数组。 我找不到确切的问题。
outputs/exec 插件的运用也非常简单,如下所示,将 logstash 切割成的内容作为参数传递给命令。这样,在每个事件到达该插件的时候,都会触发这个命令的执行。 output { exec { command => "sendsms.pl \"%{message}\" -t %{user}" } } 需要注意的是。这种方式是每次都重新开始执行一次命令并退
问题内容: 我知道这是内置的shell,我可以使用运行它。 但这有可能由家人来执行命令吗? 编辑:我只是注意到这也是没有意义的。感谢大家的帮助。 问题答案: 加载 可执行文件 并用它替换当前程序映像。正如您正确指出的那样,它 不是 可执行文件,而是内置的shell。因此,您要运行的可执行文件是外壳本身。当然,这对您有帮助,但是如果您想对其进行明确说明,则可以使用: 由于这 将替换 您当前的过程映像
问题内容: 在下面的程序中,名称为“ don”,因此该命令将搜索活动目录,其所有名称均以don开头(例如donald等)。但是从读者对象分配后,line2变量变为空,并且永远不会进入循环。我究竟做错了什么?仅供参考:当我在命令行上输入命令时,该命令有效。 问题答案: 如果我没记错的话,管道(或重定向)需要使用cmd.exe启动程序。就像是:
问题内容: 我试图便宜一些,并在Java中执行本地系统命令()。我想从中获取输出并将其存储在String中。最好的方法是什么?当前代码: 问题答案: 你的方法与我可能要做的事情并不遥远: 当然,请处理你关心的任何异常情况。
我正在尝试使用sqlite3命令,按照本SO答案给出的方式执行https://stackoverflow.com/a/25684912/426853. 以下操作始终在命令行中起作用: 我将其编码为Go,如下所示: 我有一个测试文件,像这样调用它: 测试报告了来自sqlite3的语法错误。 我怀疑问题出在将参数传递给shell,问题在于调用。我试着把它改成 但结果是一样的。我还尝试将放在命令前面,即