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

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


这样该程序可以处理指令文件。该程序提供了我想在C程序上使用的信息,但是我没有“ program2”的源代码,因此无法对其进行编辑。

目前,我正在编写“ program2”以写入文件(我可以选择在控制台上显示信息还是写入文件),然后在我的C程序中打开文件然后读取,但是我认为也许可以做得更好除此之外,但我对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)

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

最佳答案

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


使用UNIX Shell


如果您使用的是* nix,则只需执行以下两个程序即可:

    $ ./prog2 | ./prog1


prog2写入stdoutprog1stdin读取的位置。 |字符创建一个管道,即prog1prog2之间的单向通道,该管道将prog2的输出直接馈送到prog1,而无需使用临时文件。


不使用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中读取。

08-18 14:04