다른 쪽 끝의 프로세스가 종료될 때 차단 pty의 read()가 반환되는 이유는 무엇입니까?

다른 쪽 끝의 프로세스가 종료될 때 차단 pty의 read()가 반환되는 이유는 무엇입니까?

pty의 슬레이브 측이 열려 있지 않으면 strace열린 프로세스에서 read(master_fd, &byte, 1);다음이 표시됩니다.

read(3, 

따라서 데이터를 기다리는 동안 pty의 슬레이브 측에 아무도 연결되어 있지 않으면 read()오류가 반환되지 않습니다.

그러나 pty의 슬레이브 측이 프로세스에 의해 열리고 해당 프로세스가 종료되면 read()다음과 같은 이유로 프로세스가 종료됩니다.

read(3, 0xbf8ba7f3, 1)                  = -1 EIO (Input/output error)

pty는 다음 명령으로 생성되었습니다.

master_fd = posix_openpt(O_RDWR|O_NOCTTY)

pty의 슬레이브 쪽은 다음과 같이 열립니다.

comfd = open(COM_PORT, O_RDWR|O_NOCTTY)

read()pty 슬레이브를 연 프로세스가 종료될 때 왜 종료됩니까 ? 이것은 어디에 설명되어 있습니까?

답변1

Linux에서 read()pseudo-tty의 마스터 측에 있는 a는 슬레이브 측의 모든 핸들이 닫힐 때 반환되고 -1설정되지만 ERRNO슬레이브 측이 처음 열릴 때까지 차단되거나 반환됩니다.EIOEAGAIN

마스터가 없는 슬레이브 장치에서 데이터를 읽으려고 할 때도 동일한 상황이 발생합니다. 마스터 측의 경우 이 상황은 일시적입니다. 슬레이브를 다시 열면 read()마스터가 다시 작동하게 됩니다.

*BSD와 Solaris에서는 +가 대신 read()반환된다는 점을 제외하면 동작이 유사합니다 . 또한 OpenBSD에서는 슬레이브가 처음 열리기 전에 a 도 반환됩니다 .0-1EIOread()0

표준 사양이나 이유가 있는지는 모르겠지만 반대쪽 끝이 닫히는 시기를 (대략) 감지할 수 있게 하고, scriptpty를 만들고 그 안에서 다른 프로그램을 실행하는 등 프로그램의 논리를 단순화합니다.

(관련되지 않은 다른 프로그램이 연결할 수 있는) pty의 마스터 부분을 관리하는 프로그램에서 해결책은 슬레이브에 대한 핸들을 동시에 열고 열어 두는 것입니다.

관련 답변 보기:pts가 닫히면 read(2)의 차단 동작이 변경되어 read()가 오류: -1(EIO)을 반환하게 됩니다.

read()pty 슬레이브를 연 프로세스가 종료될 때 왜 종료됩니까 ?

프로세스가 종료되면 모든 파일 설명자가 자동으로 닫힙니다.

관련 정보