의사 터미널의 주요 부분을 연 후
int fd_pseudo_term_master = open("/dev/ptmx",O_RDWR);
의사 터미널의 일부를 /dev/pts/[NUMBER]
나타내는 파일이 생성됩니다 .slave
나 같은 무지한 사람은 완료되면 ptsname(fd_pseudo_term_master,filename_pseudo_term_slave,buflen);
다음으로 설정되어야 한다고 생각할 수도 있습니다.간단히
일을하고 int fd_pseudo_term_slave = open(filename_pseudo_term_slave,O_RDWR);
좋은 일을하십시오.
그러나 의사 터미널 슬레이브를 "잠금"하는 데 매우 중요한 사용 사례가 있어야 합니다. 일을 단순하게 유지하려면 open
다음을 사용해야 하기 때문입니다.남자 3 잠금 해제, "잠금 해제".
이것의 용도가 무엇인지 알 수 없습니까? 의사 터미널의 초기 잠금 필요성은 무엇입니까? 코드는 무엇을 달성합니까(libc에서 가져옴)
/* Unlock the slave pseudo terminal associated with the master pseudo
terminal specified by FD. */
int
unlockpt (int fd)
{
#ifdef TIOCSPTLCK
int save_errno = errno;
int unlock = 0;
if (ioctl (fd, TIOCSPTLCK, &unlock))
{
if (errno == EINVAL)
{
errno = save_errno;
return 0;
}
else
return -1;
}
#endif
/* If we have no TIOCSPTLCK ioctl, all slave pseudo terminals are
unlocked by default. */
return 0;
}
가능하다면 답변에는 과거 또는 현재 사용 사례가 자세히 설명되어 있습니다.
질문의 추가 부분은 다음과 같습니다.
현재 Linux 커널은 여전히 "의사 터미널 슬레이브 잠금" 기능에 의존합니까?
생각: 이것은 경주 충돌을 피하려는 비효율적인 시도입니까?
답변을 기다리는 동안 Linux 커널 소스 코드를 더 자세히 살펴봤지만 좋은 답변을 얻지 못했습니다. 그러나 의사 터미널의 초기 잠금 상황에서 "추출"된 것으로 보이는 한 가지 용도는 /dev/pts/[NUMBER]
특정 사용자가 처음에 파일에 액세스하는 것을 방지하기 위해 파일 에 대한 특정 액세스 권한을 설정할 시간을 의사 터미널 기본 프로세스에 제공하는 것입니다. . 이것이 대답의 일부일 수 있습니까? 그러나 이상한 점은 이 "초기 잠금" 상태가 종속 파일의 다중 열기를 실제로 막지는 못하는 것 같다는 것입니다. 적어도 제 생각에는 원자성을 보장하기 위한 것입니다.
답변1
기존 AT&T 시스템 5 의사 터미널 슬레이브 장치 메커니즘은 평범하다는 것입니다지속성 있는아래의 문자 장치 노드 /dev
. 멀티플렉서가 있다주인장치는 에 있습니다 /dev/ptmx
. 이전 4.3BSD 의사 터미널 장치 메커니즘에는 일반 터미널 장치의 병렬 쌍이 있었습니다.지속성 있는아래의 마스터 및 슬레이브 장치 노드입니다 /dev
.
두 경우 모두 이는 파일 설명자가 마지막으로 닫힌 이후 슬레이브 파일이 마지막 소유권과 권한을 유지한다는 것을 의미합니다. 결과적으로 grantpt()
의사 터미널을 사용하여 (재)할당 (재)할당 (재)한 후 슬레이브 장치 파일의 소유권 및 권한을 수정하는 기능이 계속 발전하고 있습니다.
open()
이는 프로그램이 과 사이에 재사용된 의사 터미널을 설정할 때 grantpt()
슬레이브 장치를 사전에 소유한 사람이 몰래 들어가서 열어 잠재적으로 다른 사람의 터미널에 액세스할 수 있는 창이 있다는 것을 의미합니다. 따라서 의사 터미널 슬레이브 캐릭터 장치의 아이디어는 열 수 없는 잠금 상태에서 시작하고 성공적인 실행 후에 잠금을 해제하는 것입니다 unlockpt()
.grantpt()
수년에 걸쳐 이는 불필요한 것으로 입증되었습니다.
오늘날 슬레이브 장치 파일은 커널이 스스로 생성하고 파괴하기 때문에 지속성이 없습니다 /dev
. 마스터를 여는 행위는 슬레이브 권한과 소유권을 재설정하거나 슬레이브 파일을 완전히 다시 생성합니다(후자의 경우 열려 있는 모든 파일 설명자가 닫힐 때 슬레이브 파일이 다시 사라집니다). 두 경우 모두 동일한 시스템 호출을 원자적으로 수행합니다. .
PTMGET
OpenBSD에서 이는 장치의 I/O 제어 기능의 일부입니다/dev/ptm
./dev
여전히 디스크 볼륨인 커널은 내부적으로 관련 호출을 실행하여 거기에 새 장치 노드를 생성하고 소유권과 권한을 재설정합니다.- FreeBSD에서는
posix_openpt()
시스템 호출을 통해 이 작업이 수행됩니다./dev
CD 볼륨이 전혀 아닙니다. 파일 시스템 입니다devfs
. 이는 열린 파일 설명자를posix_openpt()
래핑하는 것이 아니라 완전한 시스템 호출이기 때문에 "멀티플렉서" 장치나 주 장치 파일을 포함하지 않습니다 .ioctl()
슬레이브 장치는devfs
해당 디렉터리pts/
아래의 파일 시스템에 나타납니다.
따라서 커널은 처음부터 올바른 권한과 소유권을 갖도록 보장하며 오래된 권한과 소유권을 가질 가능성이 없습니다. 따라서 grantpt()
및 unlockpt()
라이브러리 함수는 본질적으로 작동하지 않습니다. 남은 기능은 전달된 파일 설명자를 확인하고 EINVAL
의사 터미널의 기본 측면이 아닌 경우 설정하는 것입니다. 비 의사 터미널 터미널 - 이러한 기능에 대한 터미널 파일 설명자이며 오류를 반환할 것으로 예상됩니다.
한동안 Linux에서는 의사 터미널 슬레이브 장치가 영구 장치 노드였습니다. GNU C 라이브러리 grantpt()
는 시스템 호출이 아닙니다. 대신 set-UID라는 도우미를 포크하고 실행합니다 pt_chown
.UID 실행 파일 세트가 없습니다.군중. ( grantpt()
권한이 없는 사용자가 반드시 소유하지 않은 특수 장치 파일의 소유권과 권한을 변경할 수 있도록 허용해야 한다는 점을 기억하십시오.) 따라서 여전히 기회의 창이 있으며 Linux는 여전히 유지 관리되어야 합니다 unlockpt()
.
"새" devpts
파일 시스템(여기서 "새"는 몇 년 전에 도입되어 지금 도입되었음을 의미함)거의그러나 FreeBSD와 동일한 방식으로 작업이 허용됩니다 devfs
. 몇 가지 차이점이 있습니다.
- "멀티플렉서" 장치도 있습니다.
- 내부에나이가 많은자동으로 생성/파기된 슬레이브 장치 파일만 포함하는 다른 파일 시스템 의 장치 인 "새"
devpts
시스템입니다 . 관례대로, 설정에는 마운트가 준비되어 있습니다.ptmx
devtmpfs
devpts
/dev/ptmx
devpts
/dev/pts
- 하지만 Linux 사람들은 갖고 싶어합니다.다중 완전 독립컨테이너 등에 사용되는 파일 시스템 인스턴스
devpts
. 존재하는 경우 두 파일 시스템을 (올바르게) 동기화하는 것이 매우 어렵습니다.많은devtmpfs
그리고devpts
파일 시스템. 그래서최신"새"devpts
시스템의 모든 장치(멀티플렉서 및 슬레이브)는 동일한 파일 시스템에 있습니다. 이전 버전과의 호환성을 위해ptmx
새ptmxmode
마운트 옵션을 설정 하지 않으면 기본적으로 새 노드에 액세스할 수 없습니다 . - 내부에심지어 업데이트됨"새" 파일 시스템의 장치 파일은
devpts
이제 기본 다중화기이며 심볼릭 링크, 바인드 마운트 또는 일반 기존 장치를 에뮬레이션하려고 시도하는 커널에서 제공하는 심입니다.ptmx
devpts
ptmx
devtmpfs
실제에 대한 심볼릭 링크입니다pts/ptmx
.
- 내부에나이가 많은자동으로 생성/파기된 슬레이브 장치 파일만 포함하는 다른 파일 시스템 의 장치 인 "새"
- 커널이 항상 소유권과 권한을 원하는 방식으로 설정하지는 않습니다
grantpt()
. 잘못된 마운트 옵션( GIDgid
이외의 옵션tty
또는mode
0620 이외의 옵션)을 설정하면 GNU C 라이브러리에서 대체 동작이 트리거됩니다.grantpt()
필요에 따라 GNU C 라이브러리에서 무작동(no-ops)을 줄이려 면 커널이 다음을 수행해야 합니다.아니요열기 프로세스의 그룹을 할당하려면(즉, 명시적인 설정이 있어야 함gid
) 할당된 그룹은tty
그룹 이어야 하며mode
새로 생성된 슬레이브 장치의 그룹은 정확히 0620이어야 합니다.
기본적으로 켜져 있지 않으며 커널과 C 라이브러리가 동기화되지 않기 때문에 /dev/pts/ptmx
GNU C 라이브러리가 완전히 무작동 상태로 축소되지 않습니다 . grantpt()
각 사람은 다른 사람의 이전 버전에서 작업해야 합니다. Linux는 여전히 이전 GNU C 라이브러리를 제공해야 하며 , 이는 올바른 설치 옵션을 갖춘 새 파일 시스템 없이 실행 상태로 다시 돌아가야 합니다 /dev/ptmx
.pt_chown
devpts
따라서 마운트 옵션이 잘못된 unlockpt()
경우 devpts
GNU C 라이브러리는 실제로 grantpt()
.
추가 읽기
- https://unix.stackexchange.com/a/470853/5132
- 이 glibc 문제를 해결하는 가장 좋은 방법은 무엇입니까?
- https://unix.stackexchange.com/a/214685/5132
Documentation/filesystems/devpts.txt
. 리눅스 커널.- 다니엘 벨랑쉬(2009-05-20).
/dev/pts
컨테이너의 보안 문제를 방지하려면 "newinstance" 마운트 플래그를 사용해야 합니다.. Red Hat 버그 #501718. - 조나단 데보인 폴라드(2018).
open-controlling-tty
.스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2018).
vc-get-tty
.스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2018).
pty-get-tty
.스낵 가이드. 소프트웨어.