无法使用exec执行简单的Shell脚本/ Commonads

时间:2017-02-14 16:41:03

标签: c++ shell exec

我用Qt5设计了一个GUI,点击一个按钮,我想启动一个python软件。起初它尝试编写一个简单的shell脚本,如下所示:

#!/bin/bash
cd ~/Printrun
python pronterface.py

该脚本在shell中直接执行时工作正常,但现在我想要一个执行脚本的c ++代码。我已经在这里找到了一些有用的东西,但我似乎无法让它在我的项目上工作。也许是因为我从Qt运行代码?

以下是代码:

execlp("home/user/", "./my_shell_script.sh", (char *)0);

execlp("home/user/Printrun", "python pronterface.py", (char *)0);

两者都不会返回任何错误,但似乎无法正常工作。

如果我遗漏了一些显而易见的东西,我很抱歉这样的话。

编辑:我也试过系统()没有成功,我读到exec是一个更清洁的解决方案

1 个答案:

答案 0 :(得分:0)

您误解了execlp()的规格。第一个参数,有时记录为path(但对于不同的exec函数更常见),应该是一直到可执行文件的路径,而不是在包含它的目录中停顿。然后,变量参数指定要作为进程的argv向量提供的所有元素,包括零 th ,它通常命名正在执行的程序。因此:

execlp("home/user/my_shell_script.sh", "my_shell_script.sh", (char *)0);

但请注意,当您提供的路径包含任何斜杠字符时,execlp()在功能上等同于execl()

此外,你的python示例(至少)似乎错误地假设第一个参数给出了进程的初始工作目录。如果要更改工作目录,则必须手动执行此操作。例如,

chdir("home/user/Printrun");
execlp("python", "pronterface.py", (char *)0);

此外,确保检查错误的函数返回值,并适当地处理它们(上面未说明),但在exec-family函数的情况下,返回表示错误。

然而,在这种情况下,你应该认识到,如果你在GUI小部件的处理函数中使用它,那么你就有潜在的问题。在这种情况下,您很可能首先要fork(),以便新进程与GUI一起运行而不是替换它,或者使用system()来处理所有分叉,执行和等待您。另请注意,与exec函数不同,system()通过shell运行您的命令。例如,那么:

system("cd ~/Printrun; python pronterface.py");