從機端使用後(open()
、read()
、write()
、close()
),主機端read()
完成並傳回 EIO 錯誤。但我期望能夠open()
/close()
多次從端而不中斷主 fd。
從機之後是否可以保持兩端有效close()
?當從端關閉時,如何保持我的“主”程序運行?我應該重新運行整個grantpt(); unlockpt(); ptsname();
序列嗎?
答案1
短:無
Long:偽終端從屬連接是一個終端的一端聯繫,像一根管子。兩者都是透過核心在用戶進程之間來回傳遞資料的方式。
一旦一端關閉,您就會失去連接。ptsname
POSIX 中的描述是這樣的:
失敗時,
ptsname()
應返回空指針。如果 fildes 是一個,則可能會發生這種情況無效的文件描述符或如果檔案系統中不存在從設備名稱。
一旦關閉文件描述符,它就無效了。
如果您想重複使用連接,您可以採取一些解決方法,例如將開啟的從屬文件描述符傳遞到新建立的進程,例如,從您編寫的用於管理從屬文件描述符的伺服器應用程式。
延伸閱讀:
- 7.2 偽終端(文字終端操作指南)
close
- 關閉檔案描述符(POSIX)grantpt
- 授予對從屬偽終端設備的存取權限(POSIX)pipe
- 建立進程間通道(POSIX)ptsname
- 取得從屬偽終端設備的名稱(POSIX)unlockpt
- 解鎖偽終端主/從對(POSIX)
上面是2016年寫的。TIOCGPPEER,這是一個ioctl
允許應用程式獲取新的文件描述符:
(自 Linux 4.13 起)給定 fd 中引用偽終端主裝置的檔案描述符,開啟(使用給定的 open(2) 樣式標誌)並傳回引用對等偽終端從裝置的新檔案描述符。無論從裝置的路徑名是否可透過呼叫程序的掛載命名空間訪問,都可以執行此操作。
(關閉的文件描述符仍然無效)。
答案2
根據對其他答案的評論:是的,實際上。
當您建立 pty 對時,讓主端程序開啟從屬端,並保持其開啟狀態。這樣,無論有多少客戶端打開和關閉從屬設備,其引用計數都永遠不會為零,並且永遠不會變得無效。