Повторите вызовы команды оболочки, захватить стандартный вывод через канал

Я пытаюсь заставить приложение C ++ для Linux регулярно проверять наличие устройства Bluetooth.
— Я могу сделать это легко через hcitool в командной строке, и это работает надежно.
— Я могу сделать это в своем приложении несколько раз, если я оставлю stdout один, и это работает.
— Я могу получить стандартный вывод в свое приложение, но, похоже, он не синхронизирован с выводом из hcitool.

Вот что я написал до сих пор:

std::string checkBluetoothPresence(std::string searchForMAC)
{
int pipeOut[2];
pid_t pid;
char btRtnVal[255] = "";

pipe2(pipeOut, O_CLOEXEC);      // Both threads will share a pipe - input from child, output to parent
switch(pid=fork())
{
case -1:    cout << "fork failed" << endl;
exit(-1);
case 0:     // Child thread
close(1);               // Close stdout
close(pipeOut[0]);      // Close the output end of pipeOut
dup2(pipeOut[1], 1);    // Redirect stdout to pipeOut input
close(pipeOut[1]);
execl("/usr/bin/hcitool", "hcitool", "name", searchForMAC.c_str(), (char*)NULL);
default:    // Parent thread
close(0);               // Close stdin
close(pipeOut[1]);      // Close the input to pipeOut
dup2(pipeOut[0], 0);    // Redirect stdin to the pipeOut output
close(pipeOut[0]);
waitpid(pid, NULL, 0);
cin.getline(btRtnVal, sizeof(btRtnVal)-1);
}
return btRtnVal;

}

В сущности, при обнаружении оно правильно получит имя моего устройства Bluetooth и вернет его. Это будет работать несколько раз подряд (моя функция main () вызывает это каждые 15 секунд). Если я затем выключу Bluetooth на моем устройстве, он возвращает пустую строку (что я и хочу). Однако после этого момента, если я снова включу Bluetooth, он больше никогда не будет работать. Это должен обнаружить его — он работает в командной строке, но не здесь. Я пробовал это со всеми удаленными командами pipe / dup2 / close, и это работает отлично (через stdout). Поэтому я предполагаю, что моя проблема лежит где-то в моих командах pipe / dup2 / close. Я перепробовал много вариантов (это только последнее), но не могу заставить его работать.

Я подозреваю, что это как-то связано с неправильным сбросом перенаправления stdout, но я прочитал и перепробовал десятки комбинаций, которые я нашел в сети и не могу заставить их работать. Любые предложения будут очень признательны — это сводит меня с ума в течение нескольких часов!

Может быть, основной вопрос: есть ли у кого-нибудь хороший, всеобъемлющий пример перенаправления вывода из команды оболочки, его чтения, а затем сброса всего, чтобы при вызове той же команды через несколько секунд она все еще работала?

0

Решение

Теперь ответили — проблема была в том, что, как указал Матс Петерссон в комментариях, я просто пропустил cin.clear () в родительской ветке. После того, как первый отказал, флаг EOF был поднят, что, как я полагаю, было бы сброшено автоматически при следующем создании потока.

0

Другие решения


По вопросам рекламы [email protected]