슬레이브 끝이 사용된 후( open()
, read()
, write()
, close()
), 마스터가 read()
종료되고 EIO 오류와 함께 반환됩니다. 그러나 나는 마스터 fd를 방해하지 않고 슬레이브 종료를 여러 번 open()
수행 할 수 있을 것으로 기대했습니다 .close()
슬레이브 이후에 두 끝을 유효하게 유지하는 것이 가능합니까 close()
? 슬레이브 끝이 닫혀 있을 때 어떻게 "마스터" 프로그램을 계속 실행시킬 수 있습니까? 전체 시퀀스를 다시 실행해야 합니까 grantpt(); unlockpt(); ptsname();
?
답변1
짧게: 아니오
Long: 의사 터미널 슬레이브 연결은연결, 파이프처럼. 둘 다 커널을 통해 사용자 프로세스 간에 데이터가 앞뒤로 전달되는 방식입니다.
한쪽 끝이 닫히면 연결이 끊어집니다. ptsname
POSIX의 설명은 다음과 같습니다 .
실패하면
ptsname()
널 포인터를 반환합니다. 이는 fildes가 다음과 같은 경우에 발생할 수 있습니다.잘못된 파일 설명자또는 슬레이브 장치 이름이 파일 시스템에 존재하지 않는 경우.
파일 설명자를 닫으면 유효하지 않습니다.
연결을 재사용하려면 열려 있는 슬레이브 파일 설명자를 새로 생성된 프로세스(예: 슬레이브 파일 설명자를 관리하기 위해 작성하는 서버 애플리케이션)에 전달하는 것과 같은 몇 가지 해결 방법을 수행할 수 있습니다.
추가 자료:
- 7.2 의사 터미널(텍스트 터미널 HOWTO)
close
- 파일 설명자를 닫습니다.(POSIX)grantpt
- 슬레이브 의사 터미널 장치에 대한 액세스 권한을 부여합니다.(POSIX)pipe
- 프로세스 간 채널을 생성합니다.(POSIX)ptsname
- 슬레이브 의사 터미널 장치의 이름을 얻습니다.(POSIX)unlockpt
- 의사 터미널 마스터/슬레이브 쌍 잠금 해제(POSIX)
위 내용은 2016년에 작성되었습니다. 2022년 댓글에는 다음과 같은 내용이 언급되어 있습니다.TIOCGPTPEER, 이는 ioctl
애플리케이션이새로운파일 설명자:
(Linux 4.13부터) fd에 의사 터미널 마스터를 참조하는 파일 설명자가 있으면 (주어진 open(2) 스타일 플래그를 사용하여) 열고 피어 의사 터미널 슬레이브 장치를 참조하는 새 파일 설명자를 반환합니다. 이 작업은 호출 프로세스의 마운트 네임스페이스를 통해 슬레이브 장치의 경로 이름에 액세스할 수 있는지 여부에 관계없이 수행될 수 있습니다.
(닫힌 파일 설명자는 여전히 유효하지 않습니다).
답변2
다른 답변에 대한 의견: 예, 실제로 그렇습니다.
pty 쌍을 생성할 때 마스터 끝 프로세스가 슬레이브 끝을 열고 열어두도록 합니다. 이렇게 하면 얼마나 많은 클라이언트가 슬레이브를 열고 닫더라도 해당 참조 카운트는 결코 0이 되지 않으며 결코 유효하지 않게 됩니다.