Написание и выполнение программы, ведущей себя как консоль

Написание и выполнение программы, ведущей себя как консоль

Я написал набор программ с целью использования радиопередатчика-приемника (NRF24L01) для соединения двух устройств так, как если бы они были подключены через последовательный интерфейс.

В настоящее время я могу отправлять команды bash в одном направлении, скажем, с устройства A на B. В настоящее время моим устройством A является микроконтроллер AVR.

Мое устройство B — Rapberry Pi. Я использую следующую команду для передачи полученного текста в bash. Это позволяет отправлять команды, но не позволяет отправлять их вывод обратно на устройство A.

./program | bash

Я не уверен, как перенаправить вывод из bash обратно в мою программу таким образом, чтобы это не блокировало и не мешало программе реагировать на полученные данные. Если возможно настроить канал в обоих направлениях, я все равно не думаю, что смогу использовать функции, как fgetsони блокируют.

Оба устройства используют одну и ту же библиотеку для функций передачи и приема; эти функции передачи и приема можно вызывать с опцией, делающей их неблокируемыми.

решение1

Самый простой подход, вероятно, заключается в том, чтобы ваша программа использовалаpipe2три раза, чтобы создать три канала (для каждого из stdin, stdout и stderr). Вероятно, вы хотите, чтобы они были в неблокируемом режиме. Затем выполните fork и заставьте дочерний процесс использоватьdup2для помещения каналов в файловые дескрипторы 0, 1 и 2. Затем ребенок использует один изсемья руководителейбежать bash.

Затем родитель может использоватьselectчтобы определить, когда есть данные для чтения или место для записи.

Вероятно, существуют библиотеки или существующие реализации, которые вы могли бы использовать.

Примечание № 1: pipe2возвращает два файловых дескриптора, один для стороны чтения и один для стороны записи канала. Например, для stdin bash, bash нужна сторона чтения (для чтения ввода), а вашей программе нужна сторона записи (для записи ввода bash). stdout bash будет противоположным: bash нужна сторона записи, вашей программе нужна сторона чтения.

Примечание №2: Это не даст вам полноценного опыта работы с терминалом; для этого вам придется иметь дело с ptys, что добавляет кучу сложностей (и, честно говоря, мне пришлось бы это изучить). Если вы этого хотите, я определенно рекомендую поискать похожую программу для начала.

Связанный контент