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

时间:2010-01-15 15:28:56

标签: c popen

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

2 个答案:

答案 0 :(得分:1)

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

希望这有帮助, 最好的祝福, 汤姆。

答案 1 :(得分:1)

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