如何在 C/C++ 中从 system() 捕获结果 [重复]

Posted

技术标签:

【中文标题】如何在 C/C++ 中从 system() 捕获结果 [重复]【英文标题】:how to capture result from system() in C/C++ [duplicate] 【发布时间】: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地址。那么,这可能吗?如果是,怎么做?

感谢您的回复

【问题讨论】:

被问过很多次。一个例子:***.com/questions/43116/… 对不起,我写这个问题的时候不知道,我没有看到相关的问题。谢谢! 【参考方案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;

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

【讨论】:

以上是关于如何在 C/C++ 中从 system() 捕获结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段中从相机捕获图像,

以最佳方式从 system() 命令捕获标准输出 [重复]

如何在 C++ 中从音频输出中捕获声音

如何在 C/C++ 中从系数和 10 的幂创建双精度数?

如何在 Quickblox iOS 中从远程视频中捕获视频帧

IOS - 如何在 Swift 3 中从 JSON 中捕获动态数组维度