Linux

當另一端的程序死亡時,為什麼阻止 pty 上的 read() 返回?

  • September 23, 2020

當 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 從屬端的程序退出時退出?這是在哪裡描述的?

在 Linuxread()上,偽 tty 的主端的 a 將返回-1並設置ERRNOEIO當其從端的所有句柄都已關閉時,但會EAGAIN在第一次打開從端之前阻塞或返回。

當試圖從沒有主控的從站讀取時,也會發生同樣的事情。對於主端,條件是暫時的;重新打開從站將導致read()主站上的 a 再次工作。

在 *BSD 和 Solaris 上,行為相似,不同之處在於read()將返回0而不是-1+ EIO。此外,在 OpenBSD 上,aread()也會0在從屬設備首次打開之前返回。

我不知道這是否有任何標準規範或基本原理,但它允許(粗略地)檢測另一端何時關閉,並簡化程序的邏輯,例如script只是創建一個 pty 並在其中執行另一個程序。

管理其他不相關程序可以連接的 pty 的主部分的程序中的解決方案是也打開並保持打開其從屬端的句柄。

請參閱相關答案:pts 關閉時 read(2) 阻塞行為發生變化導致 read() 返回錯誤:-1 (EIO)

為什麼在read()打開 pty 從屬端的程序退出時退出?

當一個程序退出時,它的所有文件描述符都會自動關閉。

引用自:https://unix.stackexchange.com/questions/538198