
He escrito un conjunto de programas con la intención de utilizar un transmisor-receptor de radio (NRF24L01) para conectar dos dispositivos como si estuvieran conectados a través de una interfaz serie.
Actualmente, puedo enviar comandos bash en una dirección, digamos del dispositivo A al B. Mi dispositivo A es actualmente un microcontrolador AVR.
Mi dispositivo B es un Rapberry Pi. Utilizo el siguiente comando para canalizar el texto recibido a bash. Esto permite enviar comandos, pero no enviar su salida al dispositivo A.
./program | bash
No estoy seguro de cómo canalizar la salida de bash nuevamente a mi programa de una manera que no bloquee ni impida que el programa reaccione a los datos recibidos. Si es posible configurar una tubería en ambas direcciones, todavía no creo que pueda usar funciones como fgets
las que están bloqueando.
Ambos dispositivos comparten la misma biblioteca para la funcionalidad de transmisión y recepción; estas funciones de transmisión y recepción se pueden llamar con una opción para que no bloqueen.
Respuesta1
El enfoque más sencillo probablemente sea hacer que su programa utilicepipe2
tres veces para crear tres tuberías (para cada una de stdin, stdout y stderr). Probablemente los quieras en modo sin bloqueo. Luego bifurque y haga que el niño usedup2
para colocar las tuberías en los descriptores de archivo 0, 1 y 2. Luego, el niño usa uno de losfamilia ejecutivacorrer bash
.
Los padres pueden entonces utilizarselect
para determinar cuándo hay datos para leer o espacio para escribir.
Probablemente existan bibliotecas o implementaciones existentes que pueda aprovechar.
Nota #1: pipe2
devuelve dos descriptores de archivo, uno para el lado de lectura y otro para el lado de escritura de la tubería. Por ejemplo, para la entrada estándar de bash, bash necesita el lado de lectura (para leer la entrada) y su programa necesita el lado de escritura (para escribir la entrada de bash). La salida estándar de bash sería lo opuesto: bash necesita el lado de escritura, su programa necesita el lado de lectura.
Nota #2: Esto no le brinda una experiencia de terminal completa; para eso necesitarías lidiar con ptys, lo que agrega mucha complejidad (y honestamente, tendría que buscarlo). Si quieres eso, definitivamente te sugiero que busques un programa similar para comenzar.