내가 아는 한 /dev/pts
파일은 ssh 또는 telnet 세션용으로 생성됩니다.
답변1
에는 아무것도 저장되어 있지 않습니다 /dev/pts
. 파일 시스템은 순전히 메모리에만 존재합니다.
항목 은 다음 /dev/pts
과 같습니다의사 터미널(pty라고 함). 유닉스 커널에는 공통 개념이 있습니다단말기. 터미널은 애플리케이션이 터미널을 통해 출력을 표시하고 입력을 받는 방법을 제공합니다.단말 장비. 프로세스에는 다음이 있을 수 있습니다.제어 터미널— 텍스트 모드 애플리케이션의 경우 이것이 사용자와 상호 작용하는 방식입니다.
터미널은 하드웨어 터미널("tty", "teletype"의 약어) 또는 의사 터미널("pty")일 수 있습니다. 하드웨어 터미널은 직렬 포트( ttyS0
, …), USB( ttyUSB0
, …) 또는 PC 화면 및 키보드( , …) 와 같은 특정 인터페이스를 통해 연결됩니다 tty1
. 의사 터미널은 애플리케이션인 터미널 에뮬레이터에서 제공됩니다. 의사 터미널의 일부 유형은 다음과 같습니다.
- GUI 응용 프로그램(예: xterm, gnome-terminal, konsole 등)은 키보드 및 마우스 이벤트를 텍스트 입력으로 변환하고 출력을 특정 글꼴로 그래픽으로 표시합니다.
- 멀티플렉서 애플리케이션(예: screen 및 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과 같은 이전 직렬 연결 터미널을 모방하기도 합니다. pseudo-tty는 키보드에서 프로그램으로, 프로그램에서 출력 장치로 바이트를 전송하는 역할을 담당합니다. 이는 간단해 보입니다. 그러나 이는 귀하의 명시적인 질문에 대한 답변입니다. /dev/pts/0
예를 들어 커널은 아무것도 저장하지 않습니다. pseudo-tty에 연결된 프로그램의 stdout에서 바이트 스트림만 들어오고, 해당 바이트는 stdin이 동일한 pseudo-tty에 연결된 프로그램에서 읽혀집니다.
또한 pseudo-tty는 이러한 바이트 스트림에 간접 계층을 배치합니다. 커널은 "Control-C", "Control-D" 또는 "Control-U"(구성 가능, 참고자료 참조 man stty
)와 같은 특수 값에 대한 바이트를 확인하고 SIGINT를 보내고 stdin에서 파일을 설정하거나 지울 수 있습니다. 입력 라인. 거기에 버퍼링 기능도 있어서 제 "아무것도 저장하지 않음"이 좀 틀린데 몇 킬로바이트밖에 안 돼요.
커널은 출력의 바이트 값을 검사하고 "\n"
개행 문자(ASCII 개행, LF 또는)를 2바이트로 변환하거나 캐리지 리턴 및 개행 문자(CRLF 또는 "\r\n"
) 또는 직렬 문자에 필요한 모든 작업을 수행할 수 있습니다. 터미널 하드웨어 바이트 작업. 의사 터미널을 간접적으로 사용하면 하드웨어로부터 독립할 수 있습니다.
pseudo-tty는 또한 모든 "전송 속도 설정", "패리티 설정" ioctl()
등의 시스템 호출을 허용하며 이에 대해 아무 작업도 수행하지 않을 수 있습니다. 이를 통해 VT-100, ADM-3 및 Wyse 시대에 작성된 프로그램이 오류 없이 계속 실행될 수 있습니다. 소프트웨어(의사 ttys 장치 드라이버)는 하드웨어처럼 작동합니다.
의사 tty는 sshd
및 에서 사용할 수 있지만 터미널 에뮬레이터(예: 또는 )와 일반적으로 xterm 내에서 실행되는 셸 telnet
간에도 사용할 수 있습니다 .xterm
rxvt
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에서 쉘을 사용해 보십시오. cat
반대편으로 나갈 때까지 꼼짝 못하게 되지만 pts/4에 입력한 대부분의 내용은 그대로 전달됩니다(예: "hello world"를 시도해 보세요. 결국 hl
pts/4와 콘솔 ello word
에 모두 입력했습니다 cat
).
내 생각에는 장치가 셸에서 입력을 받아 시스템을 통해 출력하고, 이것이 콘텐츠가 화면에 표시되는 방식입니다. 셸은 하드웨어가 아니라 시스템을 처리합니다. 시도해 보세요(무엇인지 모르면 strace bash
살펴보세요). man strace
bash가 시작되면 일련의 호출을 받게 됩니다. 이제 키를 입력해 보세요:
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
입력된 각 문자에 대해 표준 입력에서 읽고 표준 출력에 기록됩니다. 그러나 쉘의 표준 출력은 무엇에 연결되어 있습니까? 이제 strace
GUI 터미널에서 이것을 시도해 보세요. 이름을 모른다면 그것이 무엇인지 알아내야 합니다. 예를 들어 KDE에서는 이고 konsole
나는 그것이 GNOME 에 있다고 믿습니다 gnome-terminal
. 출력은 아마도 더 비밀스러울 것입니다 . strace
내 결과는 많은 poll()
합계를 가지고 있습니다. recvfrom()
아무 글도 보이지 않지만 cat
지금 다른 터미널에서 트릭을 가져오면 cat이 입력하는 동안 읽은 키 입력이 strace 출력에 전혀 응답하지 않는다는 것을 알 수 있습니다. 터미널이 이를 수신하지 않습니다. . 따라서 GUI 터미널 애플리케이션과 cat은 쉘이 출력하는 동일한 장치에서 읽기 위해 경쟁합니다.