【问题标题】:how to capture result from system() in C/C++ [duplicate]如何在 C/C++ 中从 system() 捕获结果 [重复]
【发布时间】:2010-02-14 04:18:42
【问题描述】:

可能重复:
How can I run an external program from C and parse its output?

嗨,

有人可以告诉我们在执行 system() 函数时如何捕获结果吗?

实际上我写了一个显示机器IP地址的c++程序,叫做“ipdisp”,我希望当服务器程序执行这个ipdisp程序时,服务器捕获显示的IP地址。那么,这可能吗?如果是,怎么做?

感谢您的回复

【问题讨论】:

标签: c++ c sockets


【解决方案1】:

是的,你可以这样做,但你不能使用system(),你必须改用popen()。比如:

FILE *f = popen("ipdisp", "r");
while (!feof(f)) {
    // ... read lines from f using regular stdio functions
}
pclose(f);

【讨论】:

  • 非常感谢!请澄清一下。显示的变量是例如(char *xx1;) 那么我们怎样才能得到 xx1?再次感谢!
  • 假设ipdisp 将其输出写入标准输出,您将能够通过上面的文件f 读取其标准输出。使用 fgets 或类似名称。
  • 谢谢!实际上我有两个变量:主机名和 ipaddress,我想捕获 ipaddress。标准输出是最后显示的吗?再次感谢
  • 我按照你说的写了一个小程序,但是当我读到标准输出时,我得到了这个:服务器 IP 地址是:192.168.0.113,它没有显示任何内容。那么是否有可能只得到这个“192.168.0.113”。谢谢!
【解决方案2】:

格雷格并不完全正确。您可以使用系统,但这是一个非常糟糕的主意。您可以通过将命令的输出写入临时文件然后读取文件来使用系统...但是 popen() 是一种更好的方法。例如:

#include #include 空白 死(字符*味精){ 错误(味精); 退出(EXIT_FAILURE); } 整数 主要(无效) { 尺寸_t len; 文件 *f; 诠释 c; 字符 *buf; char *cmd = "echo foo"; char *path = "/tmp/输出"; /* 应该真正使用 mkstemp() */ len = (size_t) snprintf( buf, 0, "%s > %s", cmd, path ) + 1; buf = malloc(len); if( buf == NULL ) die( "malloc"); snprintf( buf, len, "%s > %s", cmd, path ); 如果(系统(buf))死(buf); f = fopen(路径,“r”); 如果( f == NULL )死(路径); printf("命令输出:%s\n", buf); 而(((c = getc(f))!= EOF) fputc(c,标准输出); 返回 EXIT_SUCCESS; }

这种方法存在很多问题...(重定向语法的可移植性、将文件留在文件系统上、其他进程读取临时文件的安全问题等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多