【问题标题】:get the text printed due to executing cmd command in c由于在 c 中执行 cmd 命令而打印的文本
【发布时间】:2017-09-25 02:46:00
【问题描述】:

我有一个二进制文件,它打印结果而不是返回值,如果我使用 cmd 执行它,我得到打印的文本,我设法从 C 代码执行它,但似乎我通常无法获取文本打印存储在一个变量中,我以后可以用它来做进一步的决定。 我在 C 方面没有太多经验,我在 Google 上搜索了很多。 我遇到了使用剪辑的想法,但我的 cmd 说找不到剪辑命令。 任何帮助或想法将不胜感激。

【问题讨论】:

  • 在 POSIX 系统上,使用popen()
  • 它不起作用,我认为 popen 读取了输出(返回值),但我拥有的二进制文件只是使用 printf()
  • 我认为你误用了popen(),因为它在生活中的两个目的之一是让调用程序读取被调用程序的标准输出。 (另一个目的是让调用程序写入被调用程序的标准输入。)
  • An old answer of mine 可能会有所帮助。

标签: c linux raspberry-pi


【解决方案1】:

在 POSIX 系统上使用的正确函数对是 popen()pclose()。您也许可以使用 Microsoft 的 _popen()_pclose() 除非警告“此 API 不能用于在 Windows 运行时执行的应用程序中”对您很重要。

您或多或少会像这样使用它。我不得不发明您希望执行的命令的名称,因为问题没有指定。我选择了./example.exe 作为名称——我假设它不需要参数。

char cmd[] = "./example.exe";
FILE *fp = popen(cmd, "r");
if (fp != NULL)
{
    char buffer[4096];
    size_t nbytes;
    while ((nbytes = fread(buffer, sizeof(buffer), sizeof(char), fp)) != 0)
    {
        …process nbytes of data…
        …it is not a null-terminated string unless you add the null byte…
    }
    pclose(fp);
}
else
{
    …report error for failure to execute command…
}

【讨论】:

    【解决方案2】:

    您可以使用<stdlib.h> 中的system 函数来运行您想要的命令。要获取命令的输出,您可以像在this question 中一样修改命令,以将命令的输出保存到文件中。然后就可以使用<stdio.h>中的文件I/O函数来处理命令输出了。

    【讨论】:

    • 谢谢,这个二进制文件似乎使用打印函数而不是返回值。我之前尝试过您的解决方案,但它对我不起作用:(
    【解决方案3】:

    在 Linux 中,您可以执行命令替换并将其结果作为参数传递给程序,像这样

    ./your_program "$(/path/to/your/binary/file)"
    

    假设你的主要是

    int main(int argc,char* argv[]){
    .
    .
    return 0;
    }
    

    访问argv[1] 等参数。

    这里$(command) 进行替换并将二进制中的打印值作为参数传递给pgm。希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      使用 snprintf 函数。例如

      snprintf(cmdbuff, BUFFER_LEN, "dmidecode --type 17 | grep -i Size | grep -o '\\<[0-9]*\\>' | paste -sd+ | bc");
      

      这里的cmdbuff是存储命令的字符数组,BUFFER_LEN是字符数组的大小

      然后使用 popen 和 fgets 将命令的输出放入一些缓冲区,如下所示

            if((fd = popen(cmdbuff,"r")) != NULL)
        {
           fgets(buffer, BUFFER_LEN, fd);
           sprintf(vnfc_configured_memory, "%s", buffer);
           vnfc_configured_totalRAM = atof(vnfc_configured_memory);
        }
      

      【讨论】:

      • 第三个参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      相关资源
      最近更新 更多