나는 마치 직렬 인터페이스를 통해 연결된 것처럼 무선 송신기-수신기(NRF24L01)를 사용하여 두 장치를 연결하도록 설계된 일련의 프로그램을 작성했습니다.
현재는 장치 A에서 B로 bash 명령을 한 방향으로 보낼 수 있습니다. 내 A 장치는 현재 AVR 마이크로 컨트롤러입니다.
내 B 장치는 Rapberry Pi입니다. 다음 명령을 사용하여 수신된 텍스트를 bash로 파이프합니다. 이렇게 하면 명령을 보낼 수 있지만 출력을 A 장치로 다시 보낼 수는 없습니다.
./program | bash
프로그램이 수신하는 데이터에 반응하는 것을 차단하거나 방지하는 방식으로 bash의 출력을 내 프로그램으로 다시 파이프하는 방법을 모르겠습니다. 파이프를 양방향으로 설정하는 것이 가능하더라도 fgets
차단과 같은 기능을 사용할 수는 없을 것 같습니다 .
두 장치 모두 동일한 보내기 및 받기 기능 라이브러리를 공유하며 이를 비차단으로 만드는 옵션과 함께 호출할 수 있습니다.
답변1
가장 쉬운 방법은 아마도 프로그램을 사용하는 것입니다.pipe2
세 번 반복하여 세 개의 파이프(stdin, stdout 및 stderr용 하나)를 만듭니다. 아마도 당신은 그들이 비차단 모드에 있기를 원할 것입니다. 그런 다음 포크로 찔러서 아이가 사용하게 하세요.dup2
파일 설명자 0, 1, 2에 파이프를 넣습니다. 그런 다음 하위 프로세스는 다음 중 하나를 사용합니다.임원 가족달리기 bash
.
그런 다음 부모는 다음을 사용할 수 있습니다.select
읽을 데이터가 있는지 또는 쓸 공간이 있는지 확인합니다.
일부 라이브러리나 기존 구현을 활용할 수 있습니다.
참고 #1: pipe2
두 개의 파일 설명자가 반환됩니다. 하나는 파이프의 읽기 측용이고 다른 하나는 파이프의 쓰기 측용입니다. 예를 들어, bash의 표준 입력의 경우 bash에는 읽기 측(입력을 읽기 위해)이 필요하고 프로그램에는 쓰기 측(bash의 입력에 쓰기 위해)이 필요합니다. Bash의 표준 출력에서는 그 반대가 적용됩니다. Bash에는 쓰기 측면이 필요하고 프로그램에는 읽기 측면이 필요합니다.
참고 #2: 이는 완전한 터미널 경험을 제공하지 않습니다. 이를 위해서는 ptys를 처리해야 하며 이는 많은 복잡성을 추가합니다(솔직히 말해서 찾아보아야 했습니다). 이것을 원한다면 비슷한 프로그램을 찾아 시작하는 것이 좋습니다.