任何人都知道如何解决这个问题?
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)也不起作用。 ;(
答案 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
的返回值,如果没有读取任何字符(或者发生错误),则返回值为空。