2010-11-02 47 views
0

我正在使用open/close/etc在unix下執行異步文件I/O。我有一切工作正常,我能夠啓動後臺讀取和寫入,並等待他們完成使用選擇。在Unix下的異步文件IO並找出剩下多少字節

但我還有一個問題。我想知道有多少數據要讀/寫。
現在,我認爲這是一個簡單的ioctl調用,但我可以找到整個事情:(

任何人誰可以幫助將非常感謝!

回答

2

如果你正在做的很少有用的文檔從一個標準的讀取文件,可以使用lseek使用SEEK_CUR和偏移量爲0的值來獲取當前文件位置,然後lseek結束以獲取文件位置的結尾並將其減去。

不確定如何知道剩下多少數據可寫,因爲你是寫它的人,這取決於你自己的代碼。

1

你不能可靠地告訴。

例如,另一個程序可能會將數據添加到您正在閱讀的文件的末尾。

「文件」實際上可能是本地或網絡管道,根本不是文件。在這種情況下,數據僅在管道關閉時結束。

也就是說,您可以在文件描述符上使用fstat()找到文件中的字節總數(如果它文件)。

1

如果這是Solaris fstat將返回管道中的字節數。其他unixes沒有。

此外,

S_ISFIFO(st.st_mode) 

會告訴你,如果打開流是管道與否,其中ST是一個結構統計。所有unix口味都是如此。

1

您可以使用fcntl()來將您的套接字/管道設置爲非阻塞。所有呼叫read()將讀取可用數據,並且write()的呼叫將盡可能地寫入而不被阻塞。在這兩種情況下,讀取/寫入的數據量都是返回值。

例沒有任何錯誤檢查:

int flags = fcntl(fd, F_GETFL, 0); 
    fcntl(fd, F_SETFL, flags | O_NONBLOCK); 

select()後,爲所有通知句柄,調用像然後:

if (buffer_sent < buffer_size) 
     buffer_sent += write(socket, buffer+buffer_sent, buffer_size - buffer_sent); 

只是重申之前,我火燒:一個完整​​的解決方案會包括錯誤檢查。

谷歌搜索「非阻塞I/O」將導致更全面的工作示例:)