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
之外还想捕获 curl
的 stderr
,则可以对问题应用 I/O 重定向:
char bash_cmd[256] = "curl 2>&1";
这不会(直接)与 execve()
系列函数一起工作,但是 popen()
运行 通过 shell 给定的命令,它应该处理重定向运算符就好了。
然而,对于一般用途,合并 curl
的输出和错误流可能不是您想要的。如果同时发出实际输出和实际诊断,那么它们将混合在一起。
有人知道我该如何解决这个问题吗?
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
之外还想捕获 curl
的 stderr
,则可以对问题应用 I/O 重定向:
char bash_cmd[256] = "curl 2>&1";
这不会(直接)与 execve()
系列函数一起工作,但是 popen()
运行 通过 shell 给定的命令,它应该处理重定向运算符就好了。
然而,对于一般用途,合并 curl
的输出和错误流可能不是您想要的。如果同时发出实际输出和实际诊断,那么它们将混合在一起。