我正在使用open/close/etc在unix下執行異步文件I/O。我有一切工作正常,我能夠啓動後臺讀取和寫入,並等待他們完成使用選擇。在Unix下的異步文件IO並找出剩下多少字節
但我還有一個問題。我想知道有多少數據要讀/寫。
現在,我認爲這是一個簡單的ioctl調用,但我可以找到整個事情:(
任何人誰可以幫助將非常感謝!
我正在使用open/close/etc在unix下執行異步文件I/O。我有一切工作正常,我能夠啓動後臺讀取和寫入,並等待他們完成使用選擇。在Unix下的異步文件IO並找出剩下多少字節
但我還有一個問題。我想知道有多少數據要讀/寫。
現在,我認爲這是一個簡單的ioctl調用,但我可以找到整個事情:(
任何人誰可以幫助將非常感謝!
如果你正在做的很少有用的文檔從一個標準的讀取文件,可以使用lseek使用SEEK_CUR和偏移量爲0的值來獲取當前文件位置,然後lseek結束以獲取文件位置的結尾並將其減去。
不確定如何知道剩下多少數據可寫,因爲你是寫它的人,這取決於你自己的代碼。
你不能可靠地告訴。
例如,另一個程序可能會將數據添加到您正在閱讀的文件的末尾。
「文件」實際上可能是本地或網絡管道,根本不是文件。在這種情況下,數據僅在管道關閉時結束。
也就是說,您可以在文件描述符上使用fstat()
找到文件中的字節總數(如果它是文件)。
如果這是Solaris fstat將返回管道中的字節數。其他unixes沒有。
此外,
S_ISFIFO(st.st_mode)
會告訴你,如果打開流是管道與否,其中ST是一個結構統計。所有unix口味都是如此。
您可以使用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」將導致更全面的工作示例:)