C ++ popen не возвращает правильный вывод после загрузки - PullRequest
1 голос
/ 13 июня 2019

Есть что-то странное при выполнении popen в Linux. Так что в основном в гораздо большем приложении у меня есть функция с именем execute, которая запускает команду с помощью popen и возвращает вывод stdout.

#define CMD "some_command -s"     // This is the command
#define MAX_BUF 1024*6

static std::string execute(const char* cmd) {
        std::string result;
        char buffer[MAX_BUF];

        FILE* pipe = popen(cmd, "r");
        if(!pipe)
                throw -1;

        try{
                while(!feof(pipe)){
                        if(fgets(buffer, MAX_BUF, pipe) != NULL)
                                result += buffer;
                }
        }catch(...){
                pclose(pipe);
                throw;
        }

        pclose(pipe);
        return result;
}

Обычно это нормально работает, проблема возникает при перезагрузке системы. Если приложения запускаются как демон для службы, если эта служба запускается во время загрузки, размер переменной result равен 0. При выполнении service name_of_service restart, которое убивает и перезапускает приложение, оно работает, и ожидаемый размер переменной result.

Также попытался выполнить system("some_command -s > /tmp/command_out"); перед запуском popen, и файл /tmp/command_out дал ожидаемый результат. Так что это не состояние гонки, при котором зависимости some_command не были инициализированы.

UPDATE

Запуск команды на другом терминале одновременно также работает. А внутри службы, если я изменю some_command -s для других команд, таких как ls /tmp, то popen приведет к некоторому выводу.

...