如何捕获输出?
How can I capture the output?
我有一个 C 程序正在调用另一个程序,就像
system("path/program2 path/file.txt");
这样程序就可以处理指令文件了。该程序提供了我想在我的 C 程序中使用的信息,但我没有 "program2" 的来源,所以我无法编辑它。
目前我正在 "program2" 写入文件(我可以选择在控制台上显示信息或写入文件),然后在我的 C 程序上打开文件然后读取,但我认为也许有可能让它变得更好,但我对 C 真的生疏了......
任何人都可以提供一些想法 and/or 建议吗?
谢谢!
编辑
正如你们中的一些人所建议的,我查看了 fork()
、exec()
和 dup2()
函数,我认为我现在有更好的方法来共享信息。
所以,直到现在我有这个:
- program1
system()
调用 运行 program2
- program2 创建临时文件
temp.txt
并写入信息
- 回到程序 1,它打开
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会读取文件内容并使用数据
我认为这个过程可能是有效的,但我仍然有一个缺陷 - 使用文件。
我希望这个程序在服务器上 运行,所以我认为使用文件可能会造成混乱甚至危险...但这种方法仍然比我使用的方法好得多,所以直到我找到一些东西更好的是我打赌我可以找到一种方法来管理服务器端的文件创建...
那么,"new" 程序是否有效?
最终编辑:
所以,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
。
我有一个 C 程序正在调用另一个程序,就像
system("path/program2 path/file.txt");
这样程序就可以处理指令文件了。该程序提供了我想在我的 C 程序中使用的信息,但我没有 "program2" 的来源,所以我无法编辑它。
目前我正在 "program2" 写入文件(我可以选择在控制台上显示信息或写入文件),然后在我的 C 程序上打开文件然后读取,但我认为也许有可能让它变得更好,但我对 C 真的生疏了......
任何人都可以提供一些想法 and/or 建议吗?
谢谢!
编辑
正如你们中的一些人所建议的,我查看了 fork()
、exec()
和 dup2()
函数,我认为我现在有更好的方法来共享信息。
所以,直到现在我有这个:
- program1
system()
调用 运行program2
- program2 创建临时文件
temp.txt
并写入信息 - 回到程序 1,它打开
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会读取文件内容并使用数据
我认为这个过程可能是有效的,但我仍然有一个缺陷 - 使用文件。
我希望这个程序在服务器上 运行,所以我认为使用文件可能会造成混乱甚至危险...但这种方法仍然比我使用的方法好得多,所以直到我找到一些东西更好的是我打赌我可以找到一种方法来管理服务器端的文件创建...
那么,"new" 程序是否有效?
最终编辑:
所以,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
。