c ++ popen заставляет приложение останавливаться на 30 секунд - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь проанализировать поток с помощью команды popen, которая возвращает постоянный поток строк вывода.

Это приводит к зависанию приложения при вызове fgets().

Вот метод:

std::string MyClass::InvokeCmd(std::string command)
{
    std::string result;
    std::array<char, 128> buffer;
    FILE *pipe = popen(command.c_str(), "r");

        while (fgets(buffer.data(), 128, pipe) != NULL)
        {
            result += buffer.data();
        }
    }
    pclose(pipe);
    return result;
}

Команда является командой ROS:

rostopic hz / topicname

TheКоманда выполняется непрерывно и выдает одну строку вывода примерно каждую секунду.

Если я жду около 30 секунд (выглядит как время сброса буфера), я вижу данные.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Это похоже на буферизацию внутри утилиты rostopic.Когда stdout идет в терминал, многие библиотеки C достаточно умны, чтобы очищать каждый раз, когда пишется '\n'.Когда stdout идет в канал, библиотека добавит большой буфер.Похоже, что его заполнение занимает 30 секунд.

Чтобы проверить эту теорию, попробуйте rostopic hz /topicname | cat в командной строке.

Мало что можно сделать, см. этот вопрос.

0 голосов
/ 22 мая 2018

Я предлагаю вам утверждать, что труба не является nullptr.Если это nullptr, то, возможно, распечатайте команду errno и strerror ().

...