簡體   English   中英

非阻塞偽終端,POLLHUP 后恢復

[英]Non blocking pseudo terminal, recovery after POLLHUP

我通過使用open() function 和O_RDWR | O_NOCTTY | O_NONBLOCK打開/dev/ptmx創建一個新的偽終端 | O_RDWR | O_NOCTTY | O_NONBLOCK O_RDWR | O_NOCTTY | O_NONBLOCK標志。 然后我使用poll() function 等待來自遠程端的傳入數據:

struct pollfd pollFileDescriptors[numberOfTerminals];
for (unsigned terminalIndex = 0; terminalIndex < numberOfTerminals; terminalIndex++) {
    pollFileDescriptors[terminalIndex].fd = terminals[terminalIndex].getFileDescriptor();
    pollFileDescriptors[terminalIndex].events = POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND;
}

int ready = poll(pollFileDescriptors, terminals.getNumberOfTerminals(), timeoutMSec);

一切都像夢一樣工作,直到遠端關閉連接。 在這種情況下, poll() function 始終返回POLLHUP標志。 這是設計使然,但是我可以做些什么讓它像以前一樣運行,即等待另一個進程打開並使用偽終端。 我的意思是它會等待,但會立即返回並設置POLLHUP 另一方面,如果我關閉文件描述符,我無法保證收到與重新打開/dev/ptmx后相同的偽終端 ID。 有沒有辦法刪除POLLHUP標志?

我發現了一個類似的問題: Poll() on Named Pipe 經常立即返回 POLLHUP ,但是我已經使用了 O_RDWR ,如那里所述,但它在命名管道的情況下沒有幫助。

這個問題可以通過在創建后立即重新打開偽終端來輕松解決。 只要至少有一個 writer 存在,POLLHUP 就不會出現,因此我們可以自己使用open()ptsname()執行此操作:

// Create a new pseudo terminal
int fileDescriptor = open("/dev/ptmx", O_RDWR | O_NOCTTY | O_NONBLOCK);
grantpt(fileDescriptor);
unlockpt(fileDescriptor);

// Reopen it for write
const char *targetPath = ptsname(fileDescriptor);
int dummyWriterFileDescriptor = open(fileName.c_str(), O_WRONLY | O_NOCTTY | O_NONBLOCK);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM