리눅스 터미널은 어떻게 작동합니까? 대한 응답을받습니다. 이 정보는 어떻게 귀하에게 인쇄됩니까?

터미널을 시작하고 실행 파일을 호출하면 (간단 성을 위해 줄 방향이라고 가정) 실행 파일에서 명령에 대한 응답을받습니다. 이 정보는 어떻게 귀하에게 인쇄됩니까? 터미널은 다음과 같은 기능을 수행 pexpect합니까? (출력을 기다리는 설문 조사) 또는 무엇? 출력 될 출력을 어떻게 알 수 있습니까? 그리고 터미널은 어떻게 프로그램을 시작합니까? (파이썬의 os.fork ()와 비슷한 것입니까?) 터미널이 어떻게 작동하는지 의아해하고, 터미널 에뮬레이터를 가지고 놀았지만 여전히이 마법이 어떻게 작동하는지 얻지 못했습니다. 나는 konsole (kde)과 yakuake (konsole을 사용하는 것)의 출처를보고 있습니다. 나는 그 모든 마술이 일어나는 곳을 얻을 수 없습니다.



답변

원래 당신은 벙어리 터미널을 가지고있었습니다-처음에는 실제로 타자기 (전기 타자기와 비슷하지만 종이 롤이 있음) (따라서 / dev / tty-TeleTYpers), 나중에 화면 + 키보드 콤보-키 코드를 보냈습니다. 컴퓨터에 컴퓨터가 터미널에 문자를 쓰는 명령을 다시 보냈습니다 (즉, 터미널에 로컬 반향이 없으면 컴퓨터는 터미널에 사용자가 입력 한 내용을 쓰도록 컴퓨터에 명령해야했습니다). 중요한 유닉스 명령어가 너무 짧은 이유는 무엇입니까? 대부분의 터미널은 직렬 회선으로 연결되었지만 (적어도) 하나는 컴퓨터에 직접 연결되어 있습니다 (종종 같은 방). 이것은 콘솔이었습니다. 일부 사용자 만 “콘솔”에서 작업 할 수 있다고 신뢰했습니다 (단일 사용자 모드에서 사용할 수있는 유일한 “터미널”).

나중에 xterm화면 및 그래픽 화면 카드, 키보드, 마우스 및 간단한 프로세서 가있는 일부 그래픽 터미널 (소위 ” 프로그램 과 혼동하지 않는”xterminals “)이있었습니다 . X 서버를 실행할 수 있습니다. 그들은 스스로 계산을하지 않았으므로 X 클라이언트는 연결된 컴퓨터에서 실행되었습니다. 일부는 하드 디스크를 가지고 있었지만 네트워크를 통해 부팅 할 수도 있습니다. PC가 너무 싸고 강력 해지기 전에 1990 년대 초반에 인기가있었습니다.

“터미널 에뮬레이터”- “터미널 창” 은 이와 같은 프로그램으로 열거 xtermkonsole그러한 바보 터미널의 기능을 모방하려고합니다. 또한 PuTTY(Windows) 와 같은 프로그램은 터미널을 에뮬레이트합니다.

“콘솔”(키보드 + 화면)과 “컴퓨터”가 단일 장치 인 PC에서는 대신 “가상 터미널”(Linux의 경우 Alt + F1-Alt + F6 키)이 있습니다. 구식 터미널을 모방합니다. 물론, 유닉스 / 리눅스가 단일 사용자가 자주 사용하는 데스크탑 운영 체제가되어 감에 따라, 대부분의 작업은 “콘솔에서”이루어집니다. 여기서 사용자는 시리얼 라인으로 연결된 터미널을 사용했습니다.


물론 프로그램을 시작하는 쉘입니다. 그리고 fork-systemcall (C 언어)을 사용하여 환경 설정으로 자체 사본을 작성한 다음 exec-systemcall을 사용하여이 사본을 실행하려는 명령으로 변환합니다. 명령이 완료 될 때까지 명령이 백그라운드에서 실행되지 않는 한 쉘이 일시 중단됩니다. 명령이 쉘에서 stdin, stdout 및 stderr에 대한 설정을 상속하므로 명령은 터미널 화면에 기록하고 터미널 키보드에서 입력을받습니다.


답변

“터미널을 열 때”xterm, gnome-terminal, lxterm, konsole과 같은 터미널 에뮬레이터 프로그램을 시작합니다.

터미널 에뮬레이터가 수행하는 첫 번째 작업 중 하나는 의사 터미널 (pseudo-tty 또는 pty라고도 함 )을 할당하는 것 입니다. pty는 한 쌍의 문자 장치 파일입니다 . pty 마스터 (터미널 에뮬레이터가 열리는 쪽)와 pty 슬레이브 (터미널 내에서 실행되는 프로그램이 열린 쪽)입니다. 대부분의 현대 유니 세에서 마스터는 /dev/ptmx(모든 터미널 에뮬레이터가 열렸고) 슬레이브는 /dev/pts/NUMBER입니다. 의사 터미널 용 커널 드라이버는 각 슬레이브 장치의 마스터를 제어하는 ​​프로세스를 추적합니다. 터미널 에뮬레이터는 마스터 장치 의 ioctl 을 통해 해당 슬레이브에 대한 경로를 검색 할 수 있습니다 .

터미널 에뮬레이터가 마스터 장치를 열면 하위 프로세스를 시작합니다 (일반적으로 셸이지만 터미널 에뮬레이터를 호출 한 사용자의 결정에 달려 있음). 에뮬레이터는 일반적인 방법으로 프로그램을 호출합니다.

  • 자식 프로세스를 포크
  • 파일 디스크립터 0, 1 및 2 (표준 입력, 표준 출력 및 오류 스트림)에서 슬레이브 pty 장치를 엽니 다.
  • 자식 프로세스에서 쉘이나 다른 프로그램을 실행 하십시오.

자식 (또는 다른 프로세스)이 pty 슬레이브에 쓸 때 에뮬레이터는 pty 마스터에서 입력을 봅니다.

반대로 에뮬레이터가 마스터 장치에 쓸 때 슬레이브에서 입력으로 표시됩니다.

정확히 같은 방식으로 작동합니다. Expect와 xterm과 같은 터미널 에뮬레이터의 차이점은 프로그램에 입력하는 입력 (스크립트 대 키보드 입력)과 출력으로 수행하는 작업 (로그 파일 또는 파서 대 창에서 텍스트 그리기)을 얻는 것입니다.