1
我正在編寫遠程終端應用程序,我使用管道從子進程的stdout/stderr中獲取數據,然後將其發送到客戶端。具體來說,我運行的是Linux,並且我並不關心可移植性(如果解決方案僅限於Linux,那麼確定)。在管道中等待的字節
我需要知道當前有多少個字節被寫入管道,但尚未讀取。我一直在谷歌搜索,並找不到答案。我需要從管道中讀取儘可能多的字節而不會阻塞。
這可能嗎?謝謝你的幫助。
我正在編寫遠程終端應用程序,我使用管道從子進程的stdout/stderr中獲取數據,然後將其發送到客戶端。具體來說,我運行的是Linux,並且我並不關心可移植性(如果解決方案僅限於Linux,那麼確定)。在管道中等待的字節
我需要知道當前有多少個字節被寫入管道,但尚未讀取。我一直在谷歌搜索,並找不到答案。我需要從管道中讀取儘可能多的字節而不會阻塞。
這可能嗎?謝謝你的幫助。
要做到這一點的唯一方法是嘗試讀取並計算您獲得的字節數。 recv
與MSG_PEEK
可以做到這一點。
最好的辦法是將管道的讀取端設置爲非阻塞狀態,然後提前閱讀。如果你的文件描述符被設置爲非阻塞,你就可以使用read
並且管道是空的,那麼你在errno
中會得到EAGAIN
錯誤。這會告訴你管道仍然開着,但此刻只是空的。
您可以將文件描述符設置爲非塊與
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK);
然後閱讀:
while (read(fd, buffer, sizeof(buffer))) {
if (errno == EAGAIN) {} // buffer currently empty
else if (errno) {perror("read")} // an error happened
}