Linux
當另一端的程序死亡時,為什麼阻止 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 從屬端的程序退出時退出?這是在哪裡描述的?
在 Linux
read()
上,偽 tty 的主端的 a 將返回-1
並設置ERRNO
為EIO
當其從端的所有句柄都已關閉時,但會EAGAIN
在第一次打開從端之前阻塞或返回。當試圖從沒有主控的從站讀取時,也會發生同樣的事情。對於主端,條件是暫時的;重新打開從站將導致
read()
主站上的 a 再次工作。在 *BSD 和 Solaris 上,行為相似,不同之處在於
read()
將返回0
而不是-1
+EIO
。此外,在 OpenBSD 上,aread()
也會0
在從屬設備首次打開之前返回。我不知道這是否有任何標準規範或基本原理,但它允許(粗略地)檢測另一端何時關閉,並簡化程序的邏輯,例如
script
只是創建一個 pty 並在其中執行另一個程序。管理其他不相關程序可以連接的 pty 的主部分的程序中的解決方案是也打開並保持打開其從屬端的句柄。
請參閱相關答案:pts 關閉時 read(2) 阻塞行為發生變化導致 read() 返回錯誤:-1 (EIO)
為什麼在
read()
打開 pty 從屬端的程序退出時退出?當一個程序退出時,它的所有文件描述符都會自動關閉。