我有一个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
写入stdout
且prog1
从stdin
读取的位置。 |
字符创建一个管道,即prog1
和prog2
之间的单向通道,该管道将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
中读取。