Теперь мне нужно записать данные во флэш-память, которая отображается в ядро 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:~#
Я запуск собственного дистрибутива, созданного с помощью проекта Yocto на основе poky. Инструментальная цепочка также построена на основе Yocto на основе Arm-linux-gnueabi.
Я был бы признателен за некоторые рекомендации, чтобы лучше понять, что происходит.
Спасибо.
Я также протестировал другие методы, например установку флага O_NONBLOCK через fcntl, используя select и read вместо fgets и даже запуск команды с помощью fork и execlp, но для всех них поведение одинаковое. При правильной настройке неблокирующая функция не блокируется должным образом, однако информация о терминале доступна для чтения только после выполнения команды. Поэтому я думаю, что это не проблема блокировки.
Подробнее здесь: https://stackoverflow.com/questions/786 ... minal-data