C++: проблема с fgets при получении данных командного терминалаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 C++: проблема с fgets при получении данных командного терминала

Сообщение Anonymous »

Я пишу программу на C++ для встроенного приложения Linux для специального устройства. Очень часто я запускаю команды терминала Linux через popen и pclose. Если мне нужно только проверить, была ли команда выполнена успешно или нет, я проверяю возвращаемое значение pclose. В других случаях, если мне нужно проверить вывод терминала для этой команды, я использую fgets во время работы программы. Это работало очень хорошо, пока я не столкнулся со следующей ситуацией.
Теперь мне нужно записать данные во флэш-память, которая отображается в ядро ​​Linux с помощью драйвера устройства MTD. Чтобы записать данные в MTD, мне нужно сначала запустить flash_erase, а затем nandwrite. Эти команды работают нормально, если я запускаю их вручную на консоли моего устройства. Обе эти команды выводят на терминал информацию о ходе стирания/записи.
Моя программа на C++ должна запускать обе эти команды для обновления содержимого флэш-памяти. Кроме того, мое устройство имеет графический интерфейс, и я хочу собирать информацию о ходе выполнения этих команд и показывать пользователю своего рода индикатор выполнения.
Фактическая проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я запускаю команду nandwrite, fgets зависает до конца выполнения. После выполнения он сразу освобождает весь предыдущий контент терминала. То же самое не происходит ни с одной другой командой, которую я запускаю подобным образом, даже с flash_erase. С помощью flash_erase я могу получить частичный вывод во время выполнения команды, захватить вывод и показать его пользователю в графическом интерфейсе в процентах.
Пожалуйста, проверьте следующую программу. Он полностью работает и показывает именно ту проблему, которую я только что описал.

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

bool run_terminal_command(string cmd);
string get_timestamp();

int main() {
run_terminal_command("flash_erase /dev/mtd4 0 188");
run_terminal_command("nandwrite /dev/mtd4 flash_content.bin");
return 0;
}

bool run_terminal_command(string cmd) {

bool ret_val = false;

cout > [11:34:41.777] running command: nandwrite /dev/mtd4 flash_content.bin
>>> [11:34:41.779] just before loop ...
>>> [11:35:12.183] this is from fgets: Writing data to block 0 at offset 0x0
>>> [11:35:12.184] this is from fgets: Writing data to block 1 at offset 0x1000
>>> [11:35:12.184] this is from fgets: Writing data to block 2 at offset 0x2000
>>> [11:35:12.184] *** ommited ***
>>> [11:35:12.549] this is from fgets: Writing data to block 91 at offset 0x5b000
>>> [11:35:12.550] this is from fgets: Writing data to block 92 at offset 0x5c000
>>> [11:35:12.550] this is from fgets: Writing data to block 93 at offset 0x5d000
>>> [11:35:12.550] this is from fgets: Writing data to block 94 at offset 0x5e000
>>> [11:35:12.550] success

root@host:~#
Почему nandwrite передает информацию в fgets сразу только в конце команды?
Я запуск собственного дистрибутива, созданного с помощью проекта Yocto на основе poky. Инструментальная цепочка также построена на основе Yocto на основе Arm-linux-gnueabi.
Я был бы признателен за некоторые рекомендации, чтобы лучше понять, что происходит.
Спасибо.
Я также протестировал другие методы, например установку флага O_NONBLOCK через fcntl, используя select и read вместо fgets и даже запуск команды с помощью fork и execlp, но для всех них поведение одинаковое. При правильной настройке неблокирующая функция не блокируется должным образом, однако информация о терминале доступна для чтения только после выполнения команды. Поэтому я думаю, что это не проблема блокировки.

Подробнее здесь: https://stackoverflow.com/questions/786 ... minal-data
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • C++: проблема с fgets при получении данных командного терминала
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • C++: проблема с fgets при получении данных командного терминала
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Строки текста, добавленные с нежелательными символами новой строки при использовании fgets() для чтения файла.
    Anonymous » » в форуме Php
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Разница между readline и fread/fgets в php
    Anonymous » » в форуме Php
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Задержка при получении контактов с устройства, передаче их в API и получении ответа.
    Anonymous » » в форуме IOS
    0 Ответы
    95 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»