C++;system()函数—;如何收集已发出命令的输出? 我用C++代码>系统()/函数运行: int system ( const char * command );
如何从发出的命令中收集标准输出 具体来说,我想收集发出的命令的输出(例如,列出发出C++;system()函数—;如何收集已发出命令的输出? 我用C++代码>系统()/函数运行: int system ( const char * command );,c++,popen,C++,Popen,如何从发出的命令中收集标准输出 具体来说,我想收集发出的命令的输出(例如,列出发出dir命令的输出的目录)。system()返回一个int,所以只需抓取它:int-rvalue=system(command) 我相信system()将返回的确切细节是特定于系统的。在中声明和定义。您可以阅读我提供的第一个链接,也可以在shell中的命令提示符下执行man system。系统程序通常有两种“返回”值的方法:写入stdout和在程序末尾返回状态整数。(通常有更多的方法返回结果,例如写入文件或数据库,但
dir
命令的输出的目录)。system()
返回一个int
,所以只需抓取它:int-rvalue=system(command)代码>
我相信system()将返回的确切细节是特定于系统的。在中声明和定义。您可以阅读我提供的第一个链接,也可以在shell中的命令提示符下执行man system
。系统程序通常有两种“返回”值的方法:写入stdout和在程序末尾返回状态整数。(通常有更多的方法返回结果,例如写入文件或数据库,但我认为这些方法超出了本文的范围)
要接收状态代码,只需检查系统
功能的返回值
要接收输出,请将其重定向到文件中,然后读取该文件,或者使用popen
您是在查找已执行命令的返回值(如“退出状态”)还是其输出(如“打印了什么”)
如果是后者,请使用和
如果是前者,请查看system()
(并使用信息中的信息对其进行解释)的返回值。具有讽刺意味的是system
的返回值依赖于系统,但在POSIX系统(包括Linux等)中,它与for相同--低8或16位是子系统的退出状态(可能是您所说的“返回的值”),更高的位指示终止子级的信号类型(如果有)。我给出的手册页的URL提供了可以用来撬开返回值的预处理器宏
没有程序的“返回字符串”这样的东西,正如您现在在注释中所阐明的,这是您想要的;正如前面提到的另一个答案,如果您想要由另一个程序输出的文本,您应该使用popen
而不是system
我建议使用popen()功能,正如其他人所说,
但是这个问题是特定于平台的
在使用POSIXAPI的操作系统上可用。我不是
确定此命令是否适用于其他API(如WIN32),这里是一个代码片段(用普通C),它使用popen
执行命令并返回其输出:
char* exec(const char* command) {
FILE* fp;
char* result = NULL;
size_t len = 0;
fflush(NULL);
fp = popen(command, "r");
if (fp == NULL) {
printf("Cannot execute command:\n%s\n", command);
return;
}
while(getline(&result, &len, fp) != -1) {
fputs(result, stdout);
}
free(result);
fflush(fp);
if (pclose(fp) != 0) {
perror("Cannot close stream.\n");
}
return result;
}
受bmorin尝试的启发,但经过工作和测试,此代码段将接受一个char*命令并返回一个char*,其中包含执行该命令的结果
// Calling function must free the returned result.
char* exec(const char* command) {
FILE* fp;
char* line = NULL;
// Following initialization is equivalent to char* result = ""; and just
// initializes result to an empty string, only it works with
// -Werror=write-strings and is so much less clear.
char* result = (char*) calloc(1, 1);
size_t len = 0;
fflush(NULL);
fp = popen(command, "r");
if (fp == NULL) {
printf("Cannot execute command:\n%s\n", command);
return NULL;
}
while(getline(&line, &len, fp) != -1) {
// +1 below to allow room for null terminator.
result = (char*) realloc(result, strlen(result) + strlen(line) + 1);
// +1 below so we copy the final null terminator.
strncpy(result + strlen(result), line, strlen(line) + 1);
free(line);
line = NULL;
}
fflush(fp);
if (pclose(fp) != 0) {
perror("Cannot close stream.\n");
}
return result;
}
我只考虑编辑bmorin的代码,但必须更改大多数行,因此单独的回答似乎更合适。如果没有,请道歉。(除其他问题外,bmorin的代码实际上没有累积行数;它将行数打印到stdout,我想在那里不会需要行数,因为system()它在一个错误路径中返回void,此时函数必须返回一个char*,因此代码无法编译。也许最糟糕的是,它在返回结果之前释放了结果。)它们确实是:7.20.4.6系统函数:如果参数是空指针,则只有在命令处理器可用时,系统函数才会返回非零。如果参数不是空指针,并且系统函数确实返回,则返回实现定义的值I不需要system()的retrun值-我想收集发出的命令的返回字符串…你认为系统返回什么?它返回命令的返回值。该int的值是命令的返回值。也许你的意思是想收集到像stdout这样的流的输出?@mspoerr:我想你需要解释一下“发出命令的返回值”,因为您似乎以非常规的方式使用“返回值”(如果不是您所追求的int)。如果您真的不知道如何将int存储在变量中,我们在通信方面遇到了更严重的问题。感谢您的提示-我将尝试使用popen()是的,但是OP不想让它通过。他想在他的程序中把它收集成一个字符串。我想他指的是注释返回的字符串,即stdout。是的,我指的是发布的commandNote返回的字符串system()
函数(以及公认答案中建议的popen()
和pclose()
函数)也适用于C。我没有对这个问题进行双重标记(通常用C和C++双重标记不是一个好主意),但这可能是该规则的一个例外。