lseek 在CentOS 4.4 和 CentOS 6.3 下的區別

來源:互聯網
上載者:User

可以通過下面的方式獲得檔案或檔案夾的大小,其中fd 是檔案(夾)的file descriptor

long fileSize = lseek(fd, 0, SEEK_END)

但是存在下面的問題


CT6.3

如果傳給lseek的fd是一個regular file,沒有問題;
如果傳給lseek的fd是一個目錄,而不是檔案,那麼會返回一個固定值 9223372036854775807 (0x 7FFF FFFF FFFF FFFF),因為Linux下的目錄也是一個檔案;
如果傳給lseek的fd是一個非空目錄,下面有檔案並且不為空白檔案,那麼返回的仍然是那些固定值,而不是該目錄下所有檔案的大小之和


CT4.4

如果傳給lseek的fd是一個regular file,沒有問題;
如果傳給lseek的fd是一個目錄(不論是否為空白),而不是檔案,那麼會返回一個固定值 4096,因為Linux下的目錄也是一個檔案


不管是CT4.4的 4096傳回值,還是CT6.3的 9223372036854775807 傳回值,都是不對的。事實上,對一個目錄做 lseek(fd, 0, SEEK_END) 就已經不對了

如果真的對一個目錄做了 lseek(fd, 0, SEEK_END) 操作,並且將傳回值認作是“檔案”大小的話,對CT4.4 來說,也就4K大小,但對CT6.3 來說,就悲劇了:9223372036854775807,這麼大的數字,如果以它作為檔案大小負載檔案,並事先分配那麼大的記憶體空間,記憶體就撐爆了,因為 9223372036854775807 就是 0x 7FFF FFFF FFFF FFFF = 2 ^ 63 - 1,相當於 2 ^ 33 G。


這裡的CT6.3 下的 “對目錄做lseek(fd, 0, SEEK_END) 操作返回天文數字” 的情況,可以說是lseek() 函數的一個bug嗎。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.