Есть что-то странное при выполнении 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 приведет к некоторому выводу.