【发布时间】:2011-08-04 01:04:05
【问题描述】:
在我的程序中,我正在执行给定的命令并获取结果(日志和退出状态)。此外,我的程序必须支持特定于 shell 的命令(即包含特定于 shell 的字符 ~(tild)、|(pipe)、* 的命令)。但是,当我尝试通过我的程序在我的主目录中运行 sh -c ls | wc 时,它失败了,它的退出状态为 32512,也在 stderr 流中打印了 "sh: ls | wc: command not found"。
但有趣的是,如果我在 shell 中运行命令sh -c ls | wc,它可以正常工作。
有什么问题?或者更可取的是如何通过我的程序运行特定于 shell 的命令(即我应该运行哪个命令和哪个参数)?
下面的代码部分在 fork() 之后的子部分中。它执行命令。
tokenized_command 是std::vector<std::string>,在我的情况下,"sh", "-c", "ls", "|", "wc" 被存储,我也尝试在那里存储"sh", "-c", "\"ls | wc\"",但结果是一样的。 command 是 char *,其中存储了完整的命令行。
boost::shared_array<const char *> bargv(new const char *[tokenized_command.size() + 1]);
const char **argv = bargv.get();
for(int i = 0; i < tokenized_command.size(); ++i)
{
argv[i] = tokenized_command[i].c_str();
printf("argv[%d]: %s\n", i, argv[i]); //trace
}
argv[tokenized_command.size()] = NULL;
if(execvp(argv[0], (char * const *)argv) == -1)
{
fprintf(stderr, "Failed to execute command %s: %s", command, strerror(errno));
_exit(EXIT_FAILURE);
}
附言
我知道使用system(command) 代替execvp 可以解决我的问题。但是system() 等到命令完成,这对我的程序来说还不够好。而且我确信在system()的实现中使用了exec-family函数之一,所以问题也可以通过exec解决,但我不知道如何。
【问题讨论】:
-
请给出一些代码来显示你是如何运行 shell 命令的,并收集结果和退出状态。
-
我没有看到与
c或c++标签相关的任何内容,因此我删除了它们。 -
我添加了一些与
c和c++相关的内容。