返回char *中系统函数的结果

时间:2010-06-27 07:03:28

标签: c system

假设我执行system("ps-C nautilus");如何在char *中返回此函数的结果?

谢谢。

3 个答案:

答案 0 :(得分:7)

你没有。不确定您所使用的平台,但请查看popen功能。您将以这种方式获得双向管道,您可以对其执行文件操作,例如读取以从中获取字符串。

答案 1 :(得分:1)

如果您的编译器支持popen()的某种变体,则可以非常轻松地重定向输出。

注意事项:

  1. 以下代码是在Windows框中编写的,该框使用_popen()代替popen()。转换为* nix并不难。
  2. 以下代码没有错误处理。它只是为了说明这种技术。在生产中使用它之前,必须添加错误检查。
  3. 这一切都在一个线程中运行。如果程序可能运行很长时间,则可能需要使用第二个线程在运行时读取其输出。
  4. 我认为popen()是POSIX,这意味着它可以在大多数* nix框上工作,但它不是标准C,所以不应该被视为便携式。
  5. char *RunProg(const char *szCmdLine)
    {
      size_t nSize=512;
      size_t nUsed=0;
      char *szOut = malloc(nSize);
      FILE *fp = _popen(szCmdLine, "r");
      char szBuff[128];
      while( !feof( fp ) )
      {
          if( fgets( szBuff, sizeof(szBuff), fp ) != NULL )
          {
              nUsed += strlen(szBuff);
              if (nUsed >= nSize)
              {
                  nSize += nUsed;
                  szOut = realloc(szOut, nSize);
              }
              strcat(szOut, szBuff);
          }
      }
      _pclose(fp);
      return szOut;
    }
    

答案 2 :(得分:-1)

最简单的解决方案可能是这样的:

system("ps-C nautilus > /tmp/data.txt");

然后打开文件并阅读内容。

<强>更新 显然你不会使用硬编码的文件名。在上面的代码中,我只是说明了这种技术。有很多方法可以确保您的文件名是唯一的。