Использование popen () для вызова команды оболочки? - PullRequest
3 голосов
/ 15 января 2010

При запуске следующего кода через xcode я получаю противоречивое поведение. Иногда он печатает версию git правильно, а иногда ничего не печатает. Код возврата от команды оболочки всегда равен 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 ]

1 голос
/ 16 января 2010

Я думаю, что нашел источник странного поведения. Кажется, что XCode делает что-то напуганное во встроенном окне терминала, что приводит к тому, что я не вижу вывод. Если я попытаюсь запустить код непосредственно в стандартном окне терминала, это поведение не появится, и текст будет последовательно распечатан.

1 голос
/ 15 января 2010

Звучит подозрительно, как будто выходные данные буферизированы, вы рассматривали возможность очистки буфера вывода ... используйте fflush() для этого. См. здесь для получения дополнительной информации.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...