使用popen()来调用shell命令?

通过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; } 

这听起来很可疑,好像输出是缓冲的,你是否考虑过刷新输出缓冲区。使用fflush()这样做。 有关详细信息,请参见此处

希望这会有所帮助,最好的问候,汤姆。

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