태그 보관물: pty

pty

/ dev / pts 파일에 무엇이 저장되어 있으며 열 수 있습니까? ssh 또는 telnet

내 지식에 따르면 /dev/pts파일은 ssh 또는 telnet 세션을 위해 생성됩니다.



답변

에 저장된 것이 없습니다 /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명령이 그렇게합니다. 다른 터미널에서 읽기는 일반적으로 수행되지 않습니다.


답변

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

Pseudo-ttys는 이러한 바이트 스트림에 간접 계층을 넣습니다. 커널은 “Control-C”또는 “Control-D”또는 “Control-U”(모두 구성 가능, 참조 man stty)와 같은 특수 값에 대한 바이트를 검사 하고 SIGINT를 보내거나 stdin에 파일 끝을 설정하거나 지울 수 있습니다. 입력 라인. 거기 어딘가에 버퍼링 기능이 있기 때문에, 나의 “아무것도 저장하지 않는다”는 다소 틀리지 만 몇 킬로바이트 만 있습니다.

커널은 출력에서 ​​바이트 값을 검사하고 개행 (ASCII 줄 바꿈, LF 또는 "\n")을 2 바이트, 캐리지 리턴 및 줄 바꿈 (CRLF 또는 "\r\n") 또는 직렬 터미널 하드웨어에 필요한 바이트로 변환하는 것과 같은 작업을 수행 할 수 있습니다 . 의사 tty의 간접적 인 지시는 하드웨어로부터 독립성을 허용합니다.

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

의사 tty는 sshdand telnet에 의해 사용될 수 있지만 터미널 에뮬레이터 (예 : xterm또는 rxvt)와 일반적으로 xterm 내부에서 실행되는 쉘 사이에도 사용 됩니다.

리눅스와 많은 유닉스에는 의사가 있습니다. 계획 9는 그렇지 않습니다. Pseudo-tty는 직렬 케이블로 연결된 하드웨어 터미널 시절에 남겨진 약간의 유물입니다.


답변

/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반대편에 있지만,이 점 / 4에 입력 한 내용의 대부분이 통과한다 (예를 들면 시도에 “Hello World”나는 함께 종료 hl점에 / 4와 ello word상의 cat콘솔).

내 생각에 장치는 셸에서 입력을 받아 시스템을 통해 출력합니다. 이것은 화면에서 물건이 끝나는 방식입니다. 쉘은 하드웨어를 다루지 않고 시스템은 처리합니다. 시도하십시오 strace bash(그리고 man strace그것이 무엇인지 모르면 살펴 보십시오 ). 배쉬가 시작될 때 예비 전화를받습니다. 이제 키를 누르십시오.

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와 같은 이름을 모르면 konsole그놈 이름을 알아야합니다 gnome-terminal. 그의 출력은 strace아마 더 비밀입니다 – 광산을 많이 가지고 poll()recvfrom(). 글이 보이지 않지만 cat다른 터미널 에서 트릭을 가져 와서 입력 할 때 고양이가 읽는 키 스트로크는 strace 출력에서 ​​전혀 응답하지 않습니다. 터미널은 ‘ 수신하지 마십시오. 따라서 GUI 터미널 앱과 cat은 쉘이 출력하는 동일한 장치에서 읽기 위해 경쟁하고 있습니다.


답변