2013-10-18 62 views
1

我正在編寫遠程終端應用程序,我使用管道從子進程的stdout/stderr中獲取數據,然後將其發送到客戶端。具體來說,我運行的是Linux,並且我並不關心可移植性(如果解決方案僅限於Linux,那麼確定)。在管道中等待的字節

我需要知道當前有多少個字節被寫入管道,但尚未讀取。我一直在谷歌搜索,並找不到答案。我需要從管道中讀取儘可能多的字節而不會阻塞。

這可能嗎?謝謝你的幫助。

回答

0

要做到這一點的唯一方法是嘗試讀取並計算您獲得的字節數。 recvMSG_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 
}