2017-02-19 135 views
0

我有一个调用另外一个C程序,就像如何捕获输出?

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

使程序可以处理指令文件。该程序提供了我想在我的C程序中使用的信息,但我没有“program2”的源,因此我无法编辑它。

目前我正在编写一个文件(我可以选择在控制台上显示信息或写入文件之间进行选择),然后在我的C程序中打开文件然后阅读,但我想也许这是可能的使它更好,但我真的生锈的C ...

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

谢谢!


编辑

你们有些人建议,我看着fork()exec()dup2()功能,我想我有一个更好的方法现在信息共享。

所以,到现在为止我有这样的:

  • 程序1,使system()调用运行program2
  • 程序2创建一个临时文件temp.txt和写入信息
  • 回到程序1,它会打开temp.txt,读,操纵信息。

这使得2个开放式的和2个接近的现在

,与theese功能,我可以做

  • 程序1,使开放的处理程序,以temp.txt
  • 程序1,使fork()自身复制
  • on program1.child,调用dup2()函数将标准输入重定向到temp.txt
  • 在program1.child一个 exec()功能
  • 被调用运行program2
  • 程序2,使工作和显示的所有信息(将被重定向到temp.txt
  • 而这一切,program1.father将wait()直到program1.child结束
  • 上月底,program.father将读取文件内容,并使用数据

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

我想要这个程序在服务器上运行,所以我认为使用文件可能会令人困惑,甚至是危险的...但仍然这种方法比我使用的方式更好,直到我找到更好的东西我敢打赌我可以设法管理服务器端的文件创建...

所以,是“新”的程序是否有效?


最后编辑:

所以,用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

请勿使用'system'。创建一个新的进程来执行'program2',并设置它的'stdout'来管道你的'program1'。 – StoryTeller

+0

我只是谷歌它...你的意思是fork()函数? –

+0

如果你在POSIX系统上,那么是的。如果没有,请参阅您的操作系统的开发者文档。 – StoryTeller

回答

0

有两种方法可以让我想到在不使用临时文件的情况下实现您的愿望。

  1. 使用UNIX壳牌

如果您在* nix,那么你可以简单地执行这两个方案为:

$ ./prog2 | ./prog1 

prog2写入stdoutprog1stdin读取。 |字符创建一个管道,prog1prog2之间的单向信道直接联邦调查局的prog2prog1输出,而不使用临时文件。

  • 在不使用外壳

    2.1)prog2创建pipe

    int pipefd[2]; 
    pipe(pipefd); 
    

    2.2)然后forkprog2

    fork() 
    

    2.3 )接下来,在孩子execprog1pipefd[0]作为参数

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

    2.4)现在prog2pipefd[1]prog1pipefd[0]

  • 阅读在prog1你需要使用atoi()检索pipefd[0]

    foo = atoi(argv[1]); 
    

    现在从阅读。

    +0

    嗨。请记住,我无法修改“program2”,因为我没有源代码。 –

    +0

    @DavidSoléGonzález那么为什么不使用shell'pipe'运算符呢?我猜如果你没有访问源**和**你不想使用临时文件,那么这是唯一的方法。 – rootkea

    +0

    我不能在这里使用管道,我没有直接通过shell启动program1,它是我正在工作的Apache插件处理程序。谢谢你的时间 :) –