Linux에서는 터미널이 셸과 연결되어 있습니다. 터미널은 입력을 셸로 보내고(예: pwd
), 셸은 출력을 다시 터미널로 보냅니다(예: /home/paul
).
gnome-terminal
다음 그림은 터미널과 Shell 사이의 관계를 보여줍니다( Terminal 및 Shell 을 사용한다고 가정 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
슬레이브 장치를 나타냅니다.
openpty
터미널 에뮬레이터는 .(또는 새 tty에서 새 프로세스를 실행하려는 일반적인 경우에 대한 추가 설정)을 호출하여 의사 tty를 생성합니다 forkpty
. openpty
낮은 수준에서는 /dev/ptmx
일부 매직 ioctl을 열고 실행하는 작업이 포함됩니다.
터미널 에뮬레이터를 호출한 결과 파일 설명자 쌍을 얻을 수 있으며, openpty
슬레이브에 해당하는 파일 이름도 얻을 수 있습니다. /dev/pts
메인 프로세스는 자식 프로세스가 이름으로 열 필요가 없기 때문에 별도의 이름을 갖지 않습니다.
마스터 및 슬레이브 장치는 소켓의 양쪽 끝처럼 작동합니다. 한쪽 끝에 쓴 내용은 다른 쪽 끝에서 읽혀집니다. 하지만 이는 tty이기 때문에 도중에 데이터에는 모든 tty 모드가 적용됩니다.
예를 들어, 터미널 에뮬레이터이고 키 누르기를 수신하는 경우 기본 파일 설명자 A에 작성해야 합니다 . 'a'
이는 해당 바이트를 터미널에서 직렬 회선을 통해 컴퓨터로 보내는 것과 직접적으로 동일합니다. 그러면 슬레이브에서 이를 읽게 됩니다 'a'
(해당 프로그램을 읽는 프로그램(예: 셸)).
D키를 누른 상태에서 키 누름이 수신되면 1 바이트( )가 기본 파일 설명자에 기록되어야 Ctrl합니다 . (이것이 실제 터미널이 유선으로 보내는 것이기 때문입니다.) 다음에 일어나는 일은 tty 모드에 따라 다릅니다. 원시 모드에서 슬레이브 tty를 읽는 프로그램은 1 바이트를 보게 됩니다. 쿠킹 모드에서 tty는 "EOF 특수 키 누름" 동작을 활성화합니다.4
'D' ^ 0x40
4
반대 방향으로 처리하는 경우도 있습니다. 일부 프로그램이 '\n'
슬레이브 tty에 쓸 때 사후 처리 "\r\n"
로 인해 onlcr
마스터 파일 설명자에서 이를 받을 수 있습니다 .
지루하시면 역사부분은 건너뛰셔도 됩니다.
오래 전에 슬레이브 장치는 다음과 같이 이름이 지정되었으며 /dev/ttyp0
각 장치에는 해당 마스터가 있었습니다 /dev/ptyp0
. 동적으로 생성되지 않습니다. 터미널 에뮬레이터는 이들 모두를 감지하고 현재 사용하지 않는 것을 찾아 사용을 시작할 수 있습니다. 소유권과 권한을 관리하는 것이 문제입니다. xterm
setuid-root는 노예를 죽이는 데만 사용됩니다.
"UNIX98 ptys"라는 새로운 체계는 마법의 ioctl을 통해 장치 생성 및 소유권을 처리하므로 파일은 /dev/pts
사용될 때만 나타나고 파일을 생성한 프로그램을 실행하는 사용자가 소유하게 됩니다.