【问题标题】:Using popen() to invoke a shell command?使用 popen() 调用 shell 命令?
【发布时间】:2011-01-13 06:51:16
【问题描述】:

通过 xcode 运行以下代码时,我得到不一致的行为。有时它会正确打印 git 版本,有时它不会打印任何东西。但是,shell 命令的返回码始终为 0。关于为什么会这样的任何想法?我做错了什么?

#define BUFFER_SIZE 256 int main (int argc, const char * argv[]) { FILE *fpipe; char *command="/opt/local/bin/git --version"; char line[BUFFER_SIZE]; if ( !(fpipe = (FILE*)popen(command, "r")) ) { // If fpipe is NULL perror("Problems with pipe"); exit(1); } while ( fgets( line, sizeof(char) * BUFFER_SIZE, fpipe)) { // Inconsistent (happens sometimes) printf("READING LINE"); printf("%s", line); } int status = pclose(fpipe); if (status != 0) { // Never happens printf("Strange error code: %d", status); } return 0; }

【问题讨论】:

    标签: c popen


    【解决方案1】:

    听起来好像输出被缓冲了,您是否考虑过刷新输出缓冲区..使用fflush() 这样做。请参阅here 了解更多信息。

    希望这会有所帮助, 此致, 汤姆。

    【讨论】:

    • 我最初在我的代码中有它,但决定在将其粘贴到此处之前将其删除 :) 似乎没有帮助 :(
    • 在我看来这是父程序输出数据的时候。在这种情况下, fflush() 必须在 git 端完成。程序员通常会忽略这一点,因为当进程关闭时,操作系统会刷新所有缓冲区。
    【解决方案2】:

    我想我找到了奇怪行为的根源。似乎 Xcode 在内置终端窗口中做了一些时髦的事情,导致我看不到输出。如果我尝试直接在标准终端窗口中运行代码,则不会出现此行为,并且会始终打印出文本。

    【讨论】:

    • 既然你提到了它,我在 Eclipse 中遇到了这个问题——在 Eclipse 中,它是一个缺失的刷新。
    • 有趣,我尝试添加 fflush,但似乎没有帮助 - 可能只是我做错了。您能否指出在哪一行添加 fflush?
    • 如果您不在 printf 语句的末尾添加换行符 (\n),似乎在 Eclipse 终端窗口中不会显示最后一个输出行。