C标准库提供函数system
和popen
来运行命令。但有没有一种可移植的方法来检测命令是否存在?
答案 0 :(得分:11)
对于POSIX系统,我发现这个工作非常好(我在这个例子中检查了avconv):
if (system("which avconv > /dev/null 2>&1")) {
// Command doesn't exist...
} else {
// Command does exist, do something with it...
}
重定向到/ dev / null只是为了避免将任何内容打印到stdout。它仅依赖于哪个命令的退出值。
答案 1 :(得分:5)
不,没有任何标准C功能。
Unix解决方案是在getenv("PATH")
(冒号)上拆分:
,并尝试在目录中找到命令可执行文件(带有stat
函数)。
答案 2 :(得分:4)
虽然我认为没有一种完全可移植的方法(某些系统甚至不支持命令解释器),但如果在运行命令时没有错误,system()
会返回0。我想你可以尝试运行你的命令,然后检查系统的返回值。
要检查命令解释程序是否可用,请调用system( NULL )
并检查非零值。
答案 3 :(得分:3)
以下是一种扫描存储在PATH
变量中的所有路径,扫描mathsat
可执行文件的方法:
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <string>
#include <iostream>
using namespace std;
int main ()
{
struct stat sb;
string delimiter = ":";
string path = string(getenv("PATH"));
size_t start_pos = 0, end_pos = 0;
while ((end_pos = path.find(':', start_pos)) != string::npos)
{
string current_path =
path.substr(start_pos, end_pos - start_pos) + "/mathsat";
if ((stat(mathsat_path.c_str(), &sb) == 0) && (sb.st_mode & S_IXOTH))
{
cout << "Okay" << endl;
return EXIT_SUCCESS;
}
start_pos = end_pos + 1;
}
return EXIT_SUCCESS;
}