【问题标题】:C - popen not showing right outputC - popen 没有显示正确的输出
【发布时间】:2016-05-08 04:23:22
【问题描述】:

有人知道我该如何解决这个问题吗?

char bash_cmd[256] = "curl";
char buffer[1000];
FILE *pipe;
int len; 

pipe = popen(bash_cmd, "r");


if (NULL == pipe) {
    perror("pipe");
    exit(1);
} 
fgets(buffer, sizeof(buffer), pipe);
printf("OUTPUT: %s", buffer);
pclose(pipe);

以上代码片段返回以下内容:

OUTPUT: (�3B

而不是它应该返回的是:

curl: try 'curl --help' or 'curl --manual' for more information

出了点问题,我不知道是什么。当我将“curl”替换为“ls -la”时,它可以正常工作,但无论出于何种原因,只有当我使用 curl 时,它才会正确地将输出保存到缓冲区中。我能做些什么来解决这个问题?提前谢谢

此外,将“curl”替换为 curl 的完整路径 (/usr/bin/curl) 也不起作用。 ;(

【问题讨论】:

  • 首先,您未能检查函数的返回值。

标签: c file popen


【解决方案1】:

当我运行您的代码时,我发现输出确实与您描述的差不多,但是您期望的输出也立即打印在前面。因此,curl 似乎很有可能将使用消息打印到它的stderr,而不是它的stdout,它确实应该这样做。

你没有检查fgets()的返回值;我怀疑你会发现它是NULL,表示流的结束发生在读取任何数据之前。在这种情况下,我认为fgets() 不会修改提供的缓冲区。

如果您想捕获curlstderr 以及它的stdout,那么您可以对问题应用I/O 重定向:

char bash_cmd[256] = "curl 2>&1";

这不会(直接)与execve()-family 函数一起工作,但popen() 通过 shell 运行给定的命令,它应该可以很好地处理重定向运算符。

但是,出于一般目的,结合curl 的输出和错误流可能不是您想要的。如果同时发出真实输出和真实诊断,那么它们将混合在一起。

【讨论】:

  • 这修复了它。谢谢
  • 我的答案重复 :(
【解决方案2】:

您期望curl 的输出将是stderr 而不是stdout。事实上,没有任何内容写入stdout。您正在打印的输出是缓冲区的未初始化内容。

您的代码应检查fgets 的返回值,如果没有读取任何字符(或发生错误),则返回值为空。

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2023-03-28
    相关资源
    最近更新 更多