콘솔처럼 동작하는 프로그램 작성 및 실행

콘솔처럼 동작하는 프로그램 작성 및 실행

나는 무선 송신기-수신기(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의 stdin의 경우 bash에는 읽기 측(입력 읽기)이 필요하고 프로그램에는 쓰기 측(bash의 입력 쓰기)이 필요합니다. bash의 stdout은 그 반대입니다. bash에는 쓰기 측이 필요하고 프로그램에는 읽기 측이 필요합니다.

참고 #2: 이는 완전한 터미널 경험을 제공하지 않습니다. 그러기 위해서는 ptys를 처리해야 하는데, 이로 인해 복잡성이 추가됩니다(솔직히 찾아보아야 합니다). 원한다면 비슷한 프로그램을 찾아 시작하는 것이 좋습니다.

관련 정보