C - popen没有显示正确的输出

时间:2016-05-08 04:23:23

标签: c file popen

任何人都知道如何解决这个问题?

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);

上面的代码snippit返回以下内容:

OUTPUT: (�3B

而不是它应该返回的是:

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

出了点问题,我无法弄清楚是什么。当我更换" curl"用,比如," ls -la"它工作正常,但无论出于何种原因,只有当我使用curl时,它并没有将输出正确保存到缓冲区。我该怎么做才能解决这个问题?提前谢谢

另外,更换" curl"有完整的卷曲路径,(/ usr / bin / curl)也不起作用。 ;(

2 个答案:

答案 0 :(得分:1)

当我运行你的代码时,我发现输出确实与你描述的大致相同,但你预期的输出也会在之前打印出来。因此,curl似乎极有可能将使用消息打印到其stderr而非其stdout,就像它应该这样做。

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

如果除了curl之外还要捕获stderr的{​​{1}},那么您可以对问题应用I / O重定向:

stdout

这不会(直接)使用char bash_cmd[256] = "curl 2>&1"; - 族函数,但是execve()通过shell运行给定的命令,它应该处理重定向运算符。

但是,出于一般目的,组合popen()的输出和错误流可能不是您想要的。如果发出实际输出和实际诊断,那么它们将混合在一起。

答案 1 :(得分:0)

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

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