지루하시면 역사부분은 건너뛰셔도 됩니다.

지루하시면 역사부분은 건너뛰셔도 됩니다.

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/0bash/dev/pts/0
  • bash데이터가 전송될 때 해당 데이터 를 gnome-terminal쓰고 그 데이터를 읽습니다 ./dev/pts/0and 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' ^ 0x404

반대 방향으로 처리하는 경우도 있습니다. 일부 프로그램이 '\n'슬레이브 tty에 쓸 때 사후 처리 "\r\n"로 인해 onlcr마스터 파일 설명자에서 이를 받을 수 있습니다 .

지루하시면 역사부분은 건너뛰셔도 됩니다.

오래 전에 슬레이브 장치는 다음과 같이 이름이 지정되었으며 /dev/ttyp0각 장치에는 해당 마스터가 있었습니다 /dev/ptyp0. 동적으로 생성되지 않습니다. 터미널 에뮬레이터는 이들 모두를 감지하고 현재 사용하지 않는 것을 찾아 사용을 시작할 수 있습니다. 소유권과 권한을 관리하는 것이 문제입니다. xtermsetuid-root는 노예를 죽이는 데만 사용됩니다.

"UNIX98 ptys"라는 새로운 체계는 마법의 ioctl을 통해 장치 생성 및 소유권을 처리하므로 파일은 /dev/pts사용될 때만 나타나고 파일을 생성한 프로그램을 실행하는 사용자가 소유하게 됩니다.

관련 정보