나는 그런 터미널 멀티플렉서를 설계하고 싶었지만 tmux
그렇게 복잡하지는 않고 원격으로 작동할 수 있는 가장 작은 것을 ncurses
.
서버 측의 워크플로는 다음과 같습니다.
- 서버 프로세스는 총 2개의 프로세스를 생성합니다. 첫 번째 프로세스는
fork
상위 프로세스에서 가져오고forkpty
두 번째 프로세스는 상위 프로세스에서 가져옵니다.forkpty
ed 프로세스는 bash 쉘이 됩니다execl
. 첫 번째 프로세스는 호출에서 반환된 설명자를 사용하여 두 번째 프로세스와 통신합니다forkpty()
. 첫 번째 프로세스도 클라이언트와 통신합니다. 마치 중개인과 같습니다. 이는 클라이언트의 정보를forkpty
교육 프로세스로 전달하거나 그 반대의 경우도 마찬가지입니다.
클라이언트 측의 워크플로는 다음과 같습니다.
- 클라이언트는 서버와의 통신을 담당하는 스레드를 생성합니다. 내부 스레드가 실행됩니다
ncurses
.
문제는 ncurses
bash나 기타 특수 문자의 이스케이프 시퀀스를 구문 분석하지 않는다는 것입니다. 두 개의 스크린샷을 찍었습니다(클라이언트 측에서 찍은 것입니다). 첫 번째에서는 서버에서 받은 정보(셸에서 실행된 명령의 출력)가 write()
시스템 호출을 사용하여 표준 출력에 표시됩니다. 두 번째 스크린샷에는 stdscr
기능 사용에 대한 정보가 표시됩니다 printw
. 이것이 두 스크린샷 사이의 코드상의 유일한 차이점입니다.
printw
터미널을 여러 창으로 분할하고 싶기 때문에 해당 기능이 필요합니다 . ncurses
이러한 시퀀스(및 특수 문자)를 어떻게 쉽게 해석할 수 있나요 ? 스크린샷을 찾을 수 있습니다여기.
tmux
추신: 저는 아직 소스 코드를 완전히 또는 부분적으로 이해하는 수준이 아닙니다.