C - popen 不显示正确的输出

C - popen not showing right output

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

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) 也不起作用。 ;(

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

您的代码应检查 fgets 的 return 值,如果未读取任何字符(或发生错误),该值将为 null。

当我 运行 你的代码时,我发现输出确实与你所描述的大致相同,但你期望的输出也紧接在前面打印。因此,curl 似乎很有可能将使用消息打印到其 stderr 而不是其 stdout,正如它确实应该做的那样。

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

如果除了 stdout 之外还想捕获 curlstderr,则可以对问题应用 I/O 重定向:

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

这不会(直接)与 execve() 系列函数一起工作,但是 popen() 运行 通过 shell 给定的命令,它应该处理重定向运算符就好了。

然而,对于一般用途,合并 curl 的输出和错误流可能不是您想要的。如果同时发出实际输出和实际诊断,那么它们将混合在一起。