12

C标准库提供函数systempopen运行命令。但是有没有一种可移植的方法来检测命令是否存在?

4

4 回答 4

14

对于 POSIX 系统,我发现它工作得很好(在这个例子中我正在检查 avconv):

if (system("which avconv > /dev/null 2>&1")) {
    // Command doesn't exist...
} else {
    // Command does exist, do something with it...
}

重定向到 /dev/null 只是为了避免将任何内容打印到标准输出。它仅依赖于 which 命令的退出值。

于 2016-10-21T17:43:45.980 回答
5

不,没有任何标准的 C 函数。

仅 Unix 的解决方案是拆分(冒号),并尝试在目录中找到可执行的命令(带有getenv("PATH")函数)。:stat

于 2009-05-21T00:30:25.873 回答
5

虽然我认为没有一种完全可移植的方式来做到这一点(有些系统甚至不支持命令解释器),system()但如果在运行命令时没有错误,则返回 0。我想您可以尝试运行您的命令,然后检查 system.return 的返回值。

要检查命令解释器是否可用,请调用system( NULL )并检查非零值。

于 2009-05-21T01:04:18.987 回答
5

这是一种扫描存储在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;
}
于 2014-04-01T13:10:10.543 回答