如何捕获输出?

时间:2017-02-19 10:27:38

标签: c file fork exec dup2

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

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

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

目前我正在制作“program2”来写入文件(我可以选择在控制台上显示信息或写入文件)和我的C程序我打开文件然后阅读,但我想也许有可能让它变得更好但是我真的生气了......

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

谢谢!

修改

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

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

  • program1调用system()来运行program2
  • program2创建临时文件temp.txt并写入信息
  • 回到program1,打开temp.txt,阅读并操作信息。

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

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

  • program1打开temp.txt
  • 的处理程序
  • program1使fork()自我复制
  • 在program1.child上,调用dup2()函数将标准输入重定向到temp.txt
  • 在program1.child上调用exec()函数来运行program2
  • program2使其工作并显示所有信息(将重定向到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 个答案:

答案 0 :(得分:0)

在不使用临时文件的情况下,我可以通过两种方式来实现您的目标。

  1. 使用UNIX Shell
  2. 如果你在* nix上,那么你可以简单地执行两个程序:

        $ ./prog2 | ./prog1  
    

    prog2写入stdoutprog1的位置从stdin读取。 |字符会创建一个管道,即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]

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

          foo = atoi(argv[1]);  
      

      现在从foo读取。

相关问题