추가 읽기

추가 읽기

나는 Linux 터미널을 내 프로그램으로 스트리밍하고 싶습니다. /dev/ptmx를 열고 새 pts를 시작하면 이 작업이 수행된다는 것을 알고 있습니다. 이것을 테스트했는데 작동합니다(/dev/pts에서 작동합니다). 하지만 실제로 이 터미널에서 어떻게 읽고 쓸 수 있는지 잘 모르겠습니다. /dev/pts/(pts number)에 직접 쓰는 중 입력/출력 오류가 발생했습니다. 또한 동일한 프로그램을 사용하여 /dev/ptmx와 /dev/pts/(pts 번호)를 모두 열어야 할까요? 먼저 쉘을 열어야 할까요?

이 내용은 약간 혼란스럽고 이 매뉴얼 페이지 외에는 많은 정보를 찾을 수 없습니다.http://man7.org/linux/man-pages/man4/pts.4.html

답변1

이런 종류의 것에는 두 가지 다른 부분이 있습니다.

  1. 결정한 대로 의사 터미널의 마스터 측을 열면 열 수 있는 슬레이브 장치 파일이 생성됩니다. 라이브러리 기능을 사용 ptsname()하면 마스터가 장치 이름을 결정하기 위해 파일 설명자로 무언가를 열 수 있습니다.
  2. 동일하거나 다른 프로그램이 다른 프로세스에서 슬레이브 측을 열고, 로그인 하위 시스템이 실제 및 가상 터미널을 처리하는 것과 정확히 동일한 방식으로 처리합니다. 프로세스를 세션 리더로 설정하고 슬레이브 측을 세션의 제어 측으로 설정합니다. 슬레이브 측에서 파일 설명자를 열도록 표준 입력, 출력 및 오류를 설정합니다. 그런 다음 실제로 쉘이 될 수 있는 적합한 대화형 프로그램을 체인로드합니다.

일부 운영 체제에서는 첫 번째 부분이 라이브러리 함수를 호출한 후에만 두 번째 부분이 계속될 수 grantpt()있습니다 unlockpt(). 커널의 인터록은 마스터에서 이러한 조건이 발생할 때까지 슬레이브가 열릴 수 없도록 방지합니다.

흥미롭게도 이러한 기능(AT&T Unix System 5 Release 4의)은 불필요한 것으로 입증되었습니다. 슬레이브 장치가 잘못된 사용자 계정과 잘못된 권한으로 생성되는 구현으로 인해 발생합니다.심지어 나이가 많아슬레이브 측 장치는 영구 문자 장치 노드(권한과 소유권은 마지막 설정에서 유지됨)이며 즉석에서 생성되지 않으므로 다른 사용자가 실행하는 공격자 프로그램이 다양한 환경에서 터미널에 액세스할 수 있는 기회를 갖게 됩니다. 상황 . 그러나 오늘날 일부 운영 체제 커널은 처음부터 슬레이브 장치에 적절한 소유권과 권한을 제공하기 때문에 이러한 기능이 본질적으로 작동하지 않게 됩니다. FreeBSD와 OpenBSD 모두 이제 이런 방식으로 작동합니다. 불행하게도 커널 개발자들이 수년에 걸쳐 여러 번 말한 것에도 불구하고 Linux는 그러한 커널이 아닙니다.

두 번째 부분은 이것이 정확히 다른 프로세스인지에 대해 의도적으로 모호합니다. 일반적인 아키텍처는 마스터 프로세스로 fork(), 슬레이브 장치를 호출하고 ptsname()열고 마스터 파일 설명자를 닫습니다. 이것이 바로 사람들이 및 와 같은 도구를 pty-run만드는 데 사용할 수 있는 nosh 도구 세트의 기능입니다 . 이것이 GNU Screen, tmux 및 XTerm과 같은 GUI 터미널 에뮬레이터가 작동하는 방식입니다.ptybandageptyrunscript

하지만 이것은필요한물건. 열려는 파일의 이름을 알고 있는 한, 슬레이브 프로세스는 fork()마스터 프로세스의 ed 자식일 필요는 없습니다. 실제로 그렇지 않은 경우 마스터 측이나 해당 터미널, 특히 의사 터미널에 대한 지식이 필요하지 않습니다.

예를 들어, 내 사용자 공간 가상 터미널 하위 시스템에서 실행 중인 프로세스는 console-terminal-emulator슬레이브 장치 파일 이름을 가리키는 알려진 고정 이름을 가진 심볼릭 링크를 생성합니다. 완전히 독립적인 서비스 프로세스는 커널이 매번 사용하는 정확한 이름을 알 필요 없이 알려진 고정 이름을 사용하여 슬레이브 장치를 엽니다. 이러한 서비스 프로세스는 커널 가상 터미널에 연결된 유사한 서비스 프로세스와 동일하게 작동하며 실제 터미널에 연결된 서비스 프로세스와 본질적으로 동일합니다. 결국 의사 터미널의 슬레이브 측은 다른 두 가지 유형의 터미널처럼 작동하도록 설계되었습니다./dev/pts/N

추가 읽기

관련 정보