/dev/pts 파일에는 무엇이 저장되어 있으며 열 수 있나요?

/dev/pts 파일에는 무엇이 저장되어 있으며 열 수 있나요?

제가 아는 바로는 /dev/ptsssh나 telnet 세션을 위한 파일이 생성되는 것으로 알고 있습니다.

답변1

에는 아무것도 저장되어 있지 않습니다 /dev/pts. 이 파일 시스템은 순전히 메모리에만 존재합니다.

항목은 다음과 /dev/pts같습니다의사 터미널(줄여서 pty). 유닉스 커널은 다음과 같은 일반적인 개념을 가지고 있습니다.터미널. 터미널은 애플리케이션이 출력을 표시하고 터미널을 통해 입력을 받는 방법을 제공합니다.단말 장치. 프로세스에는 다음이 있을 수 있습니다.터미널 제어— 텍스트 모드 애플리케이션의 경우 이것이 사용자와 상호 작용하는 방식입니다.

터미널은 하드웨어 터미널("tty", "teletype"의 약어) 또는 의사 터미널("pty")일 수 있습니다. 하드웨어 터미널은 직렬 포트( ttyS0, …) 또는 USB( ttyUSB0, …)와 같은 일부 인터페이스나 PC 화면 및 키보드( tty1, …)를 통해 연결됩니다. 의사 터미널은 애플리케이션인 터미널 에뮬레이터에서 제공됩니다. 일부 유형의 의사 터미널은 다음과 같습니다.

  • xterm, gnome-terminal, konsole 등과 같은 GUI 응용 프로그램은 키보드 및 마우스 이벤트를 텍스트 입력으로 변환하고 출력을 일부 글꼴로 그래픽으로 표시합니다.
  • 화면 및 tmux 릴레이 입력 및 다른 터미널과의 출력과 같은 멀티플렉서 애플리케이션은 실제 터미널에서 텍스트 모드 애플리케이션을 분리합니다.
  • sshd, telnetd, rlogind 등과 같은 원격 쉘 애플리케이션은 클라이언트의 원격 터미널과 서버의 pty 사이에서 입력 및 출력을 중계합니다.

프로그램이 쓰기를 위해 터미널을 열면 해당 프로그램의 출력이 터미널에 나타납니다. 여러 프로그램이 동시에 터미널에 출력되는 것이 일반적이지만 출력의 어느 부분이 어느 프로그램에서 나왔는지 알 수 있는 방법이 없기 때문에 때때로 혼란스러울 수 있습니다. 제어 터미널에 쓰기를 시도하는 백그라운드 프로세스가SIGTTOU 신호에 의해 자동으로 중단됨.

프로그램이 읽기 위해 터미널을 열면 사용자의 입력이 해당 프로그램으로 전달됩니다. 여러 프로그램이 동일한 터미널에서 읽는 경우 각 문자는 프로그램 중 하나로 독립적으로 라우팅됩니다. 이는 권장되지 않습니다. 일반적으로 주어진 시간에 터미널에서 활발하게 읽는 프로그램은 단 하나뿐입니다. 자신이 제어하는 ​​터미널에 있지 않은 동안 읽기를 시도하는 프로그램전경~이다SIGTTIN 신호에 의해 자동으로 중단됨.

실험하려면 tty터미널에서 실행하여 터미널 장치가 무엇인지 확인하세요. 이라고 가정해보자 /dev/pts/42. 다른 터미널의 쉘에서 다음을 실행하십시오 echo hello >/dev/pts/42. 문자열이 hello다른 터미널에 표시됩니다. 이제 cat /dev/pts/42다른 터미널을 실행하고 입력하세요. 해당 명령을 종료하려면 cat(다른 터미널을 사용하기 어렵게 만들려면) Ctrl+를 누르세요 C.

알림을 표시하는 데 다른 터미널에 쓰는 것이 유용한 경우가 있습니다. 예를 들어write명령이 그렇게 합니다. 다른 터미널에서 읽는 것은 일반적으로 수행되지 않습니다.

답변2

의 파일은 /dev/pts"pseudo-ttys"입니다. 어느 정도 명명된 파이프와 비슷하지만 VT-100과 같은 오래된 직렬 연결 터미널을 모방하기도 합니다. 의사 tty는 키보드에서 프로그램으로, 프로그램에서 출력 장치로 바이트를 전송하는 작업을 수행합니다. 이는 간단해 보입니다. 그러나 이는 귀하의 명시적인 질문에 대한 답변입니다. 예를 들어 커널은 아무것도 저장하지 않습니다 /dev/pts/0. pseudo-tty에 연결된 프로그램의 stdout에서 바이트 스트림만 들어가고, stdin이 동일한 pseudo-tty에 연결된 프로그램은 해당 바이트를 읽습니다.

또한 의사 tty는 해당 바이트 스트림에 간접 계층을 추가합니다. 커널은 "Control-C", "Control-D" 또는 "Control-U"(모두 구성 가능, 참조)와 같은 특수 값에 대해 바이트를 검사하고 man sttySIGINT를 보내거나 stdin에 파일 끝을 설정하거나 지울 수 있습니다. 입력에 한 줄. 어딘가에 버퍼링 기능도 있으므로 "아무것도 저장하지 않음"은 다소 잘못되었지만 몇 킬로바이트만 차이가 납니다.

커널은 출력에서 ​​바이트 값을 검사하고 개행(ASCII 줄 바꿈, LF 또는 "\n")을 2바이트로 변환, 캐리지 리턴 및 줄 바꿈(CRLF 또는 "\r\n") 또는 직렬 터미널 하드웨어에 필요한 모든 바이트로 변환하는 등의 작업을 수행할 수 있습니다. 의사 tty의 간접 참조를 통해 하드웨어로부터 독립할 수 있습니다.

Pseudo-tty는 또한 모든 "보드 속도 설정", "패리티 설정" 등의 ioctl()시스템 호출을 허용하며 아마도 아무 작업도 수행하지 않을 것입니다. 이를 통해 VT-100, ADM-3 및 Wyse 시절에 작성된 프로그램이 오류 없이 계속 작동할 수 있습니다. pseudo-ttys 장치 드라이버인 소프트웨어는 하드웨어처럼 작동합니다.

유사 tty는 sshd및 에서 사용될 수 있지만 터미널 에뮬레이터(예: 또는 )와 일반적으로 xterm 내에서 실행되는 셸 telnet사이에도 사용됩니다 .xtermrxvt

Linux와 많은 Unix에는 의사 tty가 있습니다. 플랜 9는 그렇지 않습니다. 유사 tty는 직렬 케이블로 연결된 하드웨어 터미널 시절부터 남겨진 약간의 유물입니다.

답변3

/dev/장치 파일을 위한 특수 디렉터리입니다. 이는 추상화이며 디스크의 실제 파일이 아닙니다. 디렉토리는 부팅 시 채워지며 커널과 사용자 공간 데몬인 udevd.

이렇게 표현된 장치 중 다수는 가상입니다. 여기에는 /dev/pts콘솔 장치인 의 항목이 포함됩니다 . 이것이 원격 세션용으로 생성된 이유입니다. 로컬 GUI 터미널을 열 때도 생성됩니다.

그다지 유용한 가치는 아니지만 파일로 열 수 있습니다. /dev/pts쉘이 연결된 노드를 얻으려면 다음을 사용하십시오 tty.

> tty
/dev/pts/4

이제 다른 콘솔로 전환하여 다음을 시도해 보세요.

> echo "duck!" > /dev/pts/4

영리한. 이제 시도해 보세요:

> cat /dev/pts/4

그런 다음 /dev/pts/4에서 쉘을 사용해 보십시오. 반대편 에서 나갈 때까지 꼼짝 못하게 되지만 pts/4에 입력하는 대부분의 내용은 통과됩니다(예: pts/4와 콘솔 에서 cat"hello world"를 시도하면 끝납니다 ).hlello wordcat

내 생각에는 장치가 셸에서 입력을 받아 시스템을 통해 출력하는 것입니다. 이것이 화면에 표시되는 방식입니다. 셸은 하드웨어를 처리하는 것이 아니라 시스템입니다. 시도해 보세요 ( 무엇인지 모르신다면 strace bash한번 살펴보세요 ). man straceBash가 시작될 때 예비적으로 전화가 쇄도합니다. 이제 키를 누르십시오.

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

입력된 모든 문자에 대해 표준 입력에서 읽고 표준 출력에 씁니다. 그러나 쉘의 표준은 무엇에 연결되어 있습니까? 이제 straceGUI 터미널에서 시도해 보십시오. 이름을 모르면 이름을 알아내야 합니다. 예를 들어 KDE에서는 이고 konsoleGNOME에는 가 있다고 gnome-terminal생각합니다. 그 출력은 아마도 더 비밀스러울 것입니다. 내 출력에는 and 가 strace많이 있습니다 . 쓴 내용은 보이지 않지만 이제 다른 터미널에서 트릭을 가져오면 입력할 때 cat이 읽은 키 스트로크가 strace 출력에서 ​​전혀 응답하지 않는다는 것을 알 수 있습니다. 수신하지 않습니다. 따라서 GUI 터미널 앱과 cat은 쉘이 출력하는 동일한 장치에서 읽기 위해 경쟁하고 있습니다.poll()recvfrom()cat

관련 정보