2010-06-27 18 views

回答

1

如果您的编译器支持popen()的某些变体,则可以相当容易地重定向输出。

注意事项:

  1. 下面的代码写在Windows中,它使用_popen(),而不是popen()。 * nix转换并不困难。
  2. 下面的代码没有错误处理。这只是为了说明这项技术。在生产中使用它之前,您必须添加错误检查。
  3. 这一切都在一个线程中运行。如果程序可能运行很长时间,则可能需要使用第二个线程在运行时读取其输出。
  4. 我认为popen()是POSIX,这意味着它可以在大多数* nix盒子上工作,但它不是标准C,所以不应该被认为是可移植的。
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; 
} 
7

你不知道。不知道你在使用什么平台,而是看看popen函数。您将以这种方式获得双向管道,您可以对其进行文件操作,例如阅读以获取字符串。

+0

提问者可以用一个循环从中读取,直到它完成合并'popen',添加任何念给一个动态调整大小的字符串,并在年底转换回'字符*' 。然而这通常是一个冒险的主张;子进程的输出可能会消耗所有可用内存。 – crazyscot 2010-06-27 09:56:15

+0

我偶然发现了一个朋友在发布这个答案之后几年前写过的便携式popen()类型的API,但我不确定他会对其授予什么授权条款。如果我可以与他联系,我会询问有关情况,并在此处更新源代码链接。这真的很光滑。 – jer 2010-06-27 14:57:54

-1

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

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

然后打开该文件,并在内容中读取。

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

+1

这对多用户系统来说是一个坏主意,如果该文件已经存在或正被其他进程使用,该怎么办? – crazyscot 2010-06-27 09:53:35

+0

如果我今天没有退出选票,我会冷静下来 - 严重的是这是一个非常糟糕的主意。您不知道该文件是否事先存在,您不知道system()调用的shell是否支持管道,您不知道该文件是否存在,或者某个进程是否正在主动读取或写入该文件。充满危险。 – jer 2010-06-27 14:56:56