Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;system()函数—;如何收集已发出命令的输出? 我用C++代码>系统()/函数运行: int system ( const char * command );_C++_Popen - Fatal编程技术网

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++双重标记不是一个好主意),但这可能是该规则的一个例外。