
Escrevi um conjunto de programas com a intenção de usar um transmissor-receptor de rádio (NRF24L01) para conectar dois dispositivos como se estivessem conectados através de uma interface serial.
Atualmente, sou capaz de enviar comandos bash em uma direção, digamos do dispositivo A para B. Meu dispositivo A é atualmente um microcontrolador AVR.
Meu dispositivo B é um Rapberry Pi. Eu uso o seguinte comando para canalizar o texto recebido para o bash. Isso permite que comandos sejam enviados, mas não que sua saída seja enviada de volta ao dispositivo A.
./program | bash
Não tenho certeza de como canalizar a saída do bash de volta para o meu programa de uma forma que não bloqueie e evite que o programa reaja aos dados recebidos. Se for possível configurar um pipe nas duas direções, ainda não acho que posso usar funções como fgets
elas estão bloqueando.
Ambos os dispositivos compartilham a mesma biblioteca para funcionalidade de transmissão e recepção. Essas funções de transmissão e recepção podem ser chamadas com a opção de torná-las sem bloqueio.
Responder1
A abordagem mais fácil é provavelmente fazer com que seu programa usepipe2
três vezes para criar três pipes (para cada stdin, stdout e stderr). Provavelmente você os deseja no modo sem bloqueio. Em seguida, bifurque e peça à criança que usedup2
para colocar os pipes nos descritores de arquivo 0, 1 e 2. A criança então usa um dosfamília executivapara correr bash
.
O pai pode então usarselect
para determinar quando há dados para serem lidos ou espaço para escrever.
Provavelmente existem bibliotecas ou implementações existentes que você poderia aproveitar.
Nota nº 1: pipe2
retorna dois descritores de arquivo, um para o lado de leitura e outro para o lado de gravação do canal. Por exemplo, para o stdin do bash, o bash precisa do lado de leitura (para ler a entrada) e seu programa precisa do lado de gravação (para escrever a entrada do bash). o stdout do bash seria o oposto: o bash precisa do lado de gravação, seu programa precisa do lado de leitura.
Nota nº 2: isso não oferece uma experiência de terminal completa; para isso você precisaria lidar com ptys, o que adiciona muita complexidade (e honestamente eu teria que pesquisar). Se você quiser isso, definitivamente sugiro procurar um programa semelhante para começar.