추가 읽기

추가 읽기

의사 터미널의 주요 부분을 연 후

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. 마스터를 여는 행위는 슬레이브 권한과 소유권을 재설정하거나 슬레이브 파일을 완전히 다시 생성합니다(후자의 경우 열려 있는 모든 파일 설명자가 닫힐 때 슬레이브 파일이 다시 사라집니다). 두 경우 모두 동일한 시스템 호출을 원자적으로 수행합니다. .

  • PTMGETOpenBSD에서 이는 장치의 I/O 제어 기능의 일부입니다 /dev/ptm. /dev여전히 디스크 볼륨인 커널은 내부적으로 관련 호출을 실행하여 거기에 새 장치 노드를 생성하고 소유권과 권한을 재설정합니다.
  • FreeBSD에서는 posix_openpt()시스템 호출을 통해 이 작업이 수행됩니다. /devCD 볼륨이 전혀 아닙니다. 파일 시스템 입니다 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시스템입니다 . 관례대로, 설정에는 마운트가 준비되어 있습니다.ptmxdevtmpfsdevpts/dev/ptmxdevpts/dev/pts
    • 하지만 Linux 사람들은 갖고 싶어합니다.다중 완전 독립컨테이너 등에 사용되는 파일 시스템 인스턴스 devpts. 존재하는 경우 두 파일 시스템을 (올바르게) 동기화하는 것이 매우 어렵습니다.많은 devtmpfs그리고 devpts파일 시스템. 그래서최신"새" devpts시스템의 모든 장치(멀티플렉서 및 슬레이브)는 동일한 파일 시스템에 있습니다. 이전 버전과의 호환성을 위해 ptmxptmxmode마운트 옵션을 설정 하지 않으면 기본적으로 새 노드에 액세스할 수 없습니다 .
    • 내부에심지어 업데이트됨"새" 파일 시스템의 장치 파일은 devpts이제 기본 다중화기이며 심볼릭 링크, 바인드 마운트 또는 일반 기존 장치를 에뮬레이션하려고 시도하는 커널에서 제공하는 심입니다.ptmxdevptsptmxdevtmpfs실제에 대한 심볼릭 링크입니다 pts/ptmx.
  • 커널이 항상 소유권과 권한을 원하는 방식으로 설정하지는 않습니다 grantpt(). 잘못된 마운트 옵션( GID gid이외의 옵션 tty또는 mode0620 이외의 옵션)을 설정하면 GNU C 라이브러리에서 대체 동작이 트리거됩니다. grantpt()필요에 따라 GNU C 라이브러리에서 무작동(no-ops)을 줄이려 면 커널이 다음을 수행해야 합니다.아니요열기 프로세스의 그룹을 할당하려면(즉, 명시적인 설정이 있어야 함 gid) 할당된 그룹은 tty그룹 이어야 하며 mode새로 생성된 슬레이브 장치의 그룹은 정확히 0620이어야 합니다.

기본적으로 켜져 있지 않으며 커널과 C 라이브러리가 동기화되지 않기 때문에 /dev/pts/ptmxGNU C 라이브러리가 완전히 무작동 상태로 축소되지 않습니다 . grantpt()각 사람은 다른 사람의 이전 버전에서 작업해야 합니다. Linux는 여전히 이전 GNU C 라이브러리를 제공해야 하며 , 이는 올바른 설치 옵션을 갖춘 새 파일 시스템 없이 실행 상태로 다시 돌아가야 합니다 /dev/ptmx.pt_chowndevpts

따라서 마운트 옵션이 잘못된 unlockpt()경우 devptsGNU C 라이브러리는 실제로 grantpt().

추가 읽기

관련 정보