답변:
에 저장된 것이 없습니다 /dev/pts
. 이 파일 시스템은 순전히 메모리에 존재합니다.
의 항목 /dev/pts
은 의사 터미널입니다 (짧게는 pty). 유닉스 커널에는 일반적인 터미널 개념이 있다 . 터미널은 응용 프로그램이 터미널 장치를 통해 출력을 표시하고 입력을받는 방법을 제공합니다 . 프로세스에는 제어 터미널 이있을 수 있습니다. 텍스트 모드 응용 프로그램의 경우 사용자와 상호 작용하는 방식입니다.
터미널은 하드웨어 터미널 ( "tty", "teletype"의 약자) 또는 유사 터미널 ( "pty") 일 수 있습니다. 하드웨어 단자는 직렬 포트 ( ttyS0
,…) 또는 USB ( ttyUSB0
,…) 와 같은 일부 인터페이스 또는 PC 화면 및 키보드 ( tty1
,…)를 통해 연결됩니다. 의사 터미널은 응용 프로그램 인 터미널 에뮬레이터에 의해 제공됩니다. 의사 터미널의 일부 유형은 다음과 같습니다.
프로그램이 쓰기 위해 터미널을 열면 해당 프로그램의 출력이 터미널에 나타납니다. 여러 프로그램을 동시에 터미널에 출력하는 것이 일반적이지만 출력의 어느 부분이 어떤 프로그램에서 왔는지 알 수있는 방법이 없기 때문에 때때로 혼동 될 수 있습니다. 제어 터미널에 쓰려고하는 백그라운드 프로세스 는 SIGTTOU 신호에 의해 자동으로 중단 될 수 있습니다 .
프로그램이 읽기 위해 터미널을 열면 사용자의 입력이 해당 프로그램으로 전달됩니다. 동일한 터미널에서 여러 프로그램을 읽는 경우 각 문자는 프로그램 중 하나로 독립적으로 라우팅됩니다. 권장하지 않습니다. 일반적으로 주어진 시간에 터미널에서 능동적으로 읽는 단일 프로그램 만 있습니다. 그들이에없는 동안 자신의 제어 터미널에서 읽으려고 프로그램 전경이 되어 자동으로 SIGTTIN 신호에 의해 중단 .
실험하려면 tty
터미널에서 실행 하여 터미널 장치가 무엇인지 확인하십시오. 그것이라고 가정 해 봅시다 /dev/pts/42
. 다른 터미널의 쉘에서 다음을 실행 echo hello >/dev/pts/42
하십시오. 문자열 hello
이 다른 터미널에 표시됩니다. 이제 cat /dev/pts/42
다른 터미널을 실행 하고 입력하십시오. 해당 cat
명령 을 종료하려면 (다른 터미널을 사용하기 어렵게 함) Ctrl+를 누르십시오 C.
다른 터미널에 쓰는 것이 때때로 알림을 표시하는 데 유용합니다. 예를 들어 write
명령이 그렇게합니다. 다른 터미널에서 읽기는 일반적으로 수행되지 않습니다.
strace
프로그램은 입력을 읽을 수 있지만 그게 다입니다.
tostop
tty 플래그가 설정된 경우 터미널에 쓰는 백그라운드 프로세스 만 SIGTTOU를 얻습니다 . 이 플래그는 기본적으로 설정되어 있지 않습니다. 그리고 나는 주석 TTY에서 읽은 내용을 수정했습니다. 나는 그것을 시도했지만 작동하지만 문자 기준이 아닌 읽기 기준입니다 (쉘 프롬프트에 앉아있을 때 쉘이 한 번에 1 문자를 읽는 것과 동일합니다). 이 점을 분명히 밝히는 것이 좋을 것입니다. 이제는 귀하의 답변을 해석했습니다.
read
호출은 연속 문자 (또는 바이트 수) 만 반환하지만 응용 프로그램은 read
호출이 반환 하는 바이트 수를 제어 할 수 없으므로 더 좋지 않습니다.
파일 /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는 sshd
and 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
입력 된 모든 문자에 대해 표준 입력에서 읽기 및 표준 출력으로 쓰기가 있습니다. 그러나 쉘의 표준은 무엇에 연결되어 있습니까? 이제 strace
GUI 터미널에서 시도 하십시오. 예를 들어 KDE와 같은 이름을 모르면 konsole
그놈 이름을 알아야합니다 gnome-terminal
. 그의 출력은 strace
아마 더 비밀입니다 - 광산을 많이 가지고 poll()
와 recvfrom()
. 글이 보이지 않지만 cat
다른 터미널 에서 트릭을 가져 와서 입력 할 때 고양이가 읽는 키 스트로크는 strace 출력에서 전혀 응답하지 않습니다. 터미널은 ' 수신하지 마십시오. 따라서 GUI 터미널 앱과 cat은 쉘이 출력하는 동일한 장치에서 읽기 위해 경쟁하고 있습니다.
echo Hello > /dev/pts/1
... 무슨 일이 일어나는지, 그것이 당신의 터미널입니다.