두 프로세스 간 통신에 사용되는 의사 터미널

두 프로세스 간 통신에 사용되는 의사 터미널

타사 C 라이브러리(libmodbus중요한 경우) 직렬 장치(내 경우에는 /dev/ttyUSB0FTDI 칩셋 기반의 USB-RS485 어댑터를 통한 RS-485와 같은 장치)를 통해 통신합니다. CLI 매개변수를 기반으로 하는 이 실행 파일은 명령을 실행한 다음(내 경우에는 Modbus 클라이언트처럼) 응답을 기다리거나(내 경우에는 외부 Modbus 서버에서) 들어오는 명령을 수신할 수 있습니다(내 경우에는 예를 들어 Modbus 서버) 그런 다음 응답을 생성합니다.

외부 장치 없이 자동으로 실행 파일을 테스트하고 싶습니다. 즉, 실행 파일의 두 인스턴스를 시작하려고 합니다.

  • /dev/xxxx첫 번째 인스턴스는 Modbus 클라이언트 모드로 들어가 통신 에 사용됩니다.
  • 두 번째 인스턴스는 Modbus 서버 모드로 전환되어 /dev/yyyy통신 에 사용됩니다.
  • 설정 /dev/xxxx하고 /dev/yyyy둘 다 직렬 장치로 작동하며 기본적으로 동일한 와이어의 두 끝입니다.

내가 읽은 것에서pty 맨페이지, 나는 의사 터미널의 두 끝이라고 /dev/xxxx믿습니다 . /dev/yyyy이것은 내 질문으로 이어집니다.

  1. 매뉴얼 페이지는 BSD 스타일 의사 터미널을 참조하는데, 이는 내가 원하는 작업에 더 적합해 보입니다.
    • BSD 스타일 의사 터미널을 올바르게 이해하고 있습니까?
    • 그렇다면 BSD가 아닌 Linux 배포판에서 BSD 스타일 의사 터미널을 만드는 것이 가능합니까? 특히 저는 debian 10, 11, 12(및 Ubuntu 20.04, 22.04와 같은 debian 기반 버전)를 사용하고 있습니다.
  2. 매뉴얼 페이지에는 사용되는 UNIX 98 의사 터미널도 참조되어 있습니다 posix_openpt(). 그러나 이후에도 grantpt()클라이언트에는 unlockpt()pty용 장치만 제공할 수 있으며 마스터는 실행 파일 내의 파일 설명자일 뿐입니다./dev/pts
    • 내 이해는 (느슨하게 기반다음과 같은 코드) 옳은?
    • 그렇다면 기본 측면 파일 설명자를 사용 /dev/xxxx가능한 유일한 API인 올바른 파일 설명자로 변환하기 위해 어떤 트릭을 사용할 수 있습니까?Modbus 컨텍스트 가져오기
  3. 내가 원하는 작업을 수행할 수 있는 다른 "표준" Linux 도구가 있습니까? 이렇게 생긴 도구여기에 언급된 것들실행 파일의 STDIO가 pty에 연결될 것으로 예상합니다.

답변1

다음을 사용하여 PTY "가상 직렬 포트"를 설정할 수 있습니다.socat.

socat \
  pty,rawer,echo=0,link=/tmp/portA \
  pty,rawer,echo=0,link=/tmp/portB

이렇게 하면 두 개의 PTY 장치와 이러한 장치에 대한 두 개의 심볼릭 링크가 생성됩니다. 내 시스템에서 위 명령은 다음을 생성합니다.

$ ls -l /tmp/port*
lrwxrwxrwx 1 lars lars 11 Jul 24 11:49 /tmp/portA -> /dev/pts/20
lrwxrwxrwx 1 lars lars 11 Jul 24 11:49 /tmp/portB -> /dev/pts/21

이러한 pty 장치를 직렬 포트로 생각할 수 있습니다. 예를 들어, slcand다음 장치에 연결하여 CANbus 인터페이스를 생성할 수 있습니다.

slcand -o -c -f -s6 $(readlink /tmp/portA)
slcand -o -c -f -s6 $(readlink /tmp/portB)

아니면 picocom각 포트에 연결하고 가상 링크를 통해 채팅할 수도 있습니다. 한 창에서:

picocom $(readlink /tmp/portA)

다른 창에서:

picocom $(readlink /tmp/portB)

등.


UNIX-98 pty와 BSD 스타일 pty는 동일하게 작동합니다. 차이점은 할당 방법에 있습니다(UNIX-98 pty는 동적으로 할당되는 반면 BSD 스타일 pty는 사전 할당된 장치입니다).

그러나 후속 grantpt() 및 Unlockpt() 후에도 클라이언트에는 pty에 대한 /dev/pts 장치만 제공할 수 있으며 마스터는 실행 파일 내부의 파일 설명자일 뿐입니다.

이는 올바른 것입니다. 두 개의 pty를 연결하여 가상 직렬 회선을 생성하려면 코드에서 두 pty 장치를 모두 연 다음 둘 사이의 데이터 이동을 처리해야 합니다( socat위 예제에서 수행된 작업).

관련 정보