如何捕获输出?

How can I capture the output?

我有一个 C 程序正在调用另一个程序,就像

system("path/program2 path/file.txt");

这样程序就可以处理指令文件了。该程序提供了我想在我的 C 程序中使用的信息,但我没有 "program2" 的来源,所以我无法编辑它。

目前我正在 "program2" 写入文件(我可以选择在控制台上显示信息或写入文件),然后在我的 C 程序上打开文件然后读取,但我认为也许有可能让它变得更好,但我对 C 真的生疏了......

任何人都可以提供一些想法 and/or 建议吗?

谢谢!


编辑

正如你们中的一些人所建议的,我查看了 fork()exec()dup2() 函数,我认为我现在有更好的方法来共享信息。

所以,直到现在我有这个:

这使得 2 个打开和 2 个关闭

现在有了这些功能,我可以做到

我认为这个过程可能是有效的,但我仍然有一个缺陷 - 使用文件。

我希望这个程序在服务器上 运行,所以我认为使用文件可能会造成混乱甚至危险...但这种方法仍然比我使用的方法好得多,所以直到我找到一些东西更好的是我打赌我可以找到一种方法来管理服务器端的文件创建...

那么,"new" 程序是否有效?


最终编辑:

所以,popen()所有问题都解决了。

FILE *in;
extern FILE *popen();
char buff[512];

if(!(in = popen("path/program2 path/file.txt", "r"))){
    //error;
}

while(fgets(buff, sizeof(buff), in) != NULL){
    printf("%s", buff);
}

pclose(in);

(摘自sw-at.com)

谢谢大家的帮助!我今天学到了一些东西!

我可以想到两种方法来实现您想要的而不使用临时文件。

  1. 使用 UNIX Shell

如果你在 *nix 上,那么你可以简单地执行这两个程序:

    $ ./prog2 | ./prog1  

其中 prog2 写入 stdoutprog1stdin 读取。 | 字符在 prog1prog2 之间创建一个管道,一个单向通道,它直接将 prog2 的输出馈送到 prog1 而不使用临时文件。

  1. 不使用 Shell

    2.1) 在 prog2 中创建一个 pipe:

    int pipefd[2];
    pipe(pipefd);  
    

    2.2) 然后 fork prog2

    fork()  
    

    2.3) 接下来,在子 exec prog1 中以 pipefd[0] 作为参数

    char buffer[10];
    snprintf(buffer, 10, "%s", pipefd[0]);
    int execl("./prog1", "./prog1", buffer, (char *)0);
    

    2.4) 现在在 prog2 写入 pipefd[1] 并在 prog1 读取 pipefd[0]

prog1 中您需要使用 atoi() 来检索 pipefd[0]

    foo = atoi(argv[1]);  

现在阅读foo