我有一个调用另一个的C程序,就像
一样system("path/program2 path/file.txt");
这样程序就可以处理指令文件了。该程序提供了我想在我的C程序中使用的信息,但我没有“program2”的来源,所以我无法编辑它。
目前我正在制作“program2”来写入文件(我可以选择在控制台上显示信息或写入文件)和我的C程序我打开文件然后阅读,但我想也许有可能让它变得更好但是我真的生气了......
任何人都可以提供一些想法和/或建议吗?
谢谢!
修改
正如你们中的一些人建议的那样,我查看了fork()
,exec()
和dup2()
函数,我认为我现在有更好的方法来共享信息。
所以,直到现在我还有这个:
system()
来运行program2
temp.txt
并写入信息temp.txt
,阅读并操作信息。这使得2个开放和2个关闭
现在,有了这些功能,我可以做到
temp.txt
fork()
自我复制dup2()
函数将标准输入重定向到temp.txt
exec()
函数来运行program2
temp.txt
wait()
直到program1.child结束我认为这个程序可能有效,但我仍有一个缺陷 - 使用文件。
我希望这个程序在服务器上运行,所以我认为使用文件可能会令人困惑甚至危险......但是这种方法仍然比我使用的方法更好,直到找到更好的东西我敢打赌我可以制作一种在服务器端管理文件创建的方法......
那么,“新”程序是否有效?
最终编辑:
所以,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)
谢谢大家的帮助!我今天学到了一些东西!
答案 0 :(得分:0)
在不使用临时文件的情况下,我可以通过两种方式来实现您的目标。
如果你在* 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
读取。