PTY를 닫은 후 슬레이브 끝을 재사용할 수 있습니까?

PTY를 닫은 후 슬레이브 끝을 재사용할 수 있습니까?

슬레이브 끝이 사용된 후( open(), read(), write(), close()), 마스터가 read()종료되고 EIO 오류와 함께 반환됩니다. 그러나 나는 마스터 fd를 방해하지 않고 슬레이브 종료를 여러 번 open()수행 할 수 있을 것으로 기대했습니다 .close()

슬레이브 이후에 두 끝을 유효하게 유지하는 것이 가능합니까 close()? 슬레이브 끝이 닫혀 있을 때 어떻게 "마스터" 프로그램을 계속 실행시킬 수 있습니까? 전체 시퀀스를 다시 실행해야 합니까 grantpt(); unlockpt(); ptsname();?

답변1

짧게: 아니오

Long: 의사 터미널 슬레이브 연결은연결, 파이프처럼. 둘 다 커널을 통해 사용자 프로세스 간에 데이터가 앞뒤로 전달되는 방식입니다.

한쪽 끝이 닫히면 연결이 끊어집니다. ptsnamePOSIX의 설명은 다음과 같습니다 .

실패하면 ptsname()널 포인터를 반환합니다. 이는 fildes가 다음과 같은 경우에 발생할 수 있습니다.잘못된 파일 설명자또는 슬레이브 장치 이름이 파일 시스템에 존재하지 않는 경우.

파일 설명자를 닫으면 유효하지 않습니다.

연결을 재사용하려면 열려 있는 슬레이브 파일 설명자를 새로 생성된 프로세스(예: 슬레이브 파일 설명자를 관리하기 위해 작성하는 서버 애플리케이션)에 전달하는 것과 같은 몇 가지 해결 방법을 수행할 수 있습니다.

추가 자료:

위 내용은 2016년에 작성되었습니다. 2022년 댓글에는 다음과 같은 내용이 언급되어 있습니다.TIOCGPTPEER, 이는 ioctl애플리케이션이새로운파일 설명자:

(Linux 4.13부터) fd에 의사 터미널 마스터를 참조하는 파일 설명자가 있으면 (주어진 open(2) 스타일 플래그를 사용하여) 열고 피어 의사 터미널 슬레이브 장치를 참조하는 새 파일 설명자를 반환합니다. 이 작업은 호출 프로세스의 마운트 네임스페이스를 통해 슬레이브 장치의 경로 이름에 액세스할 수 있는지 여부에 관계없이 수행될 수 있습니다.

(닫힌 파일 설명자는 여전히 유효하지 않습니다).

답변2

다른 답변에 대한 의견: 예, 실제로 그렇습니다.

pty 쌍을 생성할 때 마스터 끝 프로세스가 슬레이브 끝을 열고 열어두도록 합니다. 이렇게 하면 얼마나 많은 클라이언트가 슬레이브를 열고 닫더라도 해당 참조 카운트는 결코 0이 되지 않으며 결코 유효하지 않게 됩니다.

관련 정보