Я написал набор программ с целью использования радиопередатчика-приемника (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, что добавляет кучу сложностей (и, честно говоря, мне пришлось бы это изучить). Если вы этого хотите, я определенно рекомендую поискать похожую программу для начала.