
Linux에서 터미널은 셸과 연결됩니다. 터미널은 입력을 셸로 보내고(예: pwd
), 셸은 출력을 다시 터미널로 보냅니다(예: /home/paul
).
이 다이어그램은 터미널과 셸 간의 관계를 보여줍니다(내가 사용하는 터미널은 이고 gnome-terminal
셸은 이라고 가정 bash
).
이제 제가 알고 싶은 것은 터미널과 셸이 데이터를 교환하기 위해 어떤 메커니즘을 사용하는지입니다. 내 생각엔 이런 일이 일어난다고 생각한다:
- 이 실행 되면
gnome-terminal
디렉터리에 직렬 포트를 나타내는 파일이 생성됩니다/dev/pts
(파일 이름은 이라고 가정/dev/pts/0
). gnome-terminal
그런 다음 연결된 셸(예:bash
)을 실행하고 pts 파일 이름을 전달합니다(예를 들어 pts 파일 이름은 명령줄 인수를 통해 전달할 수 있음).- 이제
gnome-terminal
및 둘 다bash
에서 읽기 시작합니다/dev/pts/0
. gnome-terminal
에 데이터를 보내려고 하면 이 데이터를 에bash
쓰고 에서 이 데이터를 읽습니다 ./dev/pts/0
bash
/dev/pts/0
bash
에 데이터를 보내려고 하면gnome-terminal
이 데이터를 에 쓰고/dev/pts/0
에서and
gnome-terminal
이 데이터를 읽습니다/dev/pts/0
.
이 다이어그램은 방금 설명한 내용을 보여줍니다.
내가 이해한 것이 맞나요?
메모: 물론 가상 터미널을 사용하는 경우(즉, GUI를 사용하지 않는 경우) pts 파일은 tty 파일일 수 있지만 논리는 여전히 동일합니다.
답변1
꼭 필요한 부분이 빠졌네요. 의사 tty 장치는 소켓처럼 대칭이 아닙니다. 마스터 엔드와 슬레이브 엔드가 있습니다. 의 파일은 /dev/pts
슬레이브 장치를 나타냅니다.
터미널 에뮬레이터는 호출을 통해 의사 tty를 생성합니다 openpty
(또는 새 tty에서 새 프로세스를 실행하려는 일반적인 경우에 대한 일부 보너스 설정도 추가됨) forkpty
. openpty
낮은 수준에서는 /dev/ptmx
일부 마법 ioctl을 열고 수행하는 작업이 포함됩니다.
터미널 에뮬레이터를 호출한 결과 한 쌍의 파일 설명자를 가져오고 슬레이브에 해당하는 openpty
파일 이름도 가져올 수 있습니다 . /dev/pts
마스터는 이름으로 열려면 하위 프로세스가 필요하지 않기 때문에 개별 이름을 얻지 못합니다.
마스터 및 슬레이브 장치는 일종의 소켓의 반대쪽 끝처럼 작동합니다. 한쪽 끝에 쓴 내용을 다른 쪽 끝에서 읽습니다. 그러나 이것은 tty이기 때문에 모든 tty 모드가 도중에 데이터에 적용됩니다.
예를 들어, 터미널 에뮬레이터이고 키 누르기를 수신한 경우 마스터 파일 설명자에 A써야 합니다 . 'a'
이는 터미널에서 컴퓨터로 직렬 회선을 통해 해당 바이트를 보내는 것과 직접적으로 동일합니다. 결과적으로 'a'
슬레이브에서 읽게 됩니다(읽는 프로그램이 무엇이든(예: 셸)).
D키가 눌려져 있는 동안 키 누르기를 수신하면 마스터 파일 설명자에 바이트( ) Ctrl를 써야 합니다 . (실제 터미널이 유선으로 전송하는 것이기 때문입니다.) 다음에 일어나는 일은 tty 모드에 따라 다릅니다. 원시 모드에서 슬레이브 tty를 읽는 프로그램은 바이트를 보게 됩니다. 쿠킹 모드에서 tty는 "EOF 특수 키 누름" 동작을 활성화합니다.4
'D' ^ 0x40
4
반대방향에도 약간의 처리가 있습니다. 일부 프로그램이 '\n'
슬레이브 tty에 쓸 때 사후 처리 "\r\n"
로 인해 마스터 파일 설명자를 받게 될 것입니다.onlcr
역사 섹션, 지루하면 건너뛰세요
오래 전에 슬레이브 장치에는 와 같은 이름이 있었고 /dev/ttyp0
각 장치에는 와 같은 해당 마스터가 있었습니다 /dev/ptyp0
. 동적으로 생성되지 않았습니다. 터미널 에뮬레이터는 현재 사용되지 않는 항목을 모두 검색하여 사용을 시작할 수 있습니다. 소유권과 권한을 관리하는 것이 문제였습니다. xterm
노예를 chown할 수 있도록 setuid-root였습니다.
"UNIX98 ptys"라는 새로운 체계는 마법 ioctl을 통해 장치 생성 및 소유권을 처리하므로 파일은 /dev/pts
사용 중일 때만 표시되며 파일을 생성한 프로그램을 실행한 사용자가 소유하게 됩니다.