2014-03-07 46 views
1

我正在處理大文件。 (>>> 2GB)。我的問題是如果文件大於sizeof(int)的話,在文件描述符上使用fileno()是安全的嗎?fileno()和大於2GB的文件

這裏快速的代碼片段:

#define _FILE_OFFSET_BITS 64 
#include <stdio.h> 
#include <inttypes.h> 


int readstuff(FILE *fp,uint64_t seekpoint, uint64_t seekwidth) { 
    int j; 
    char buf[seekwidth]; 

    if (pread(fileno(fp),buf,seekwidth,seekpoint)!=-1) { 
     /* do stuf */ 
     return 1; 
    } 
    else { 
     return 2; 
    } 
} 

int main() { 
    FILE *FP; 

    FP=fopen("/testfile","r"); 
    readstuff(FP,0,10000); 
} 
+1

'fileno(3)'返回與給定的'FILE'指針相關的整數文件描述符。除非你有超過'MAXINT'文件打開你不會有問題(這不太可能)。也許你正在考慮'ftell(3)',它會返回一個'long'? – Perry

+0

不,我在想,因爲我真的不知道fileno()如何在後臺工作。我想可能大於2GB的文件可能會導致問題,因爲在整個文件中至少在32位系統上有超過sizeof(int)字節 – RG337

+0

我編輯了原始問題以澄清 – RG337

回答

1

fileno(3)給人file descriptor首位,而其固定的小整數一旦你fopen -ed一個標準輸入輸出FILE流。一個進程通常只有幾十個文件描述符,偶爾(對於某些服務器,請參閱C10K problem)有幾十個文件描述符。

內核被分配的文件描述符(如與open(2)等...),並給出了「小」(通常連續的)整數

通常,文件描述符是一個非負整數通常小於100,一般小於100000.當然,文件描述符與文件大小無關。

嘗試ls /proc/self/fd/列出進程的文件描述符運行ls命令和ls /proc/1234/fd/列出的PID 1234

命令cat /proc/sys/fs/file-max使您的系統上文件描述符的總累積最大數目過程的文件描述符(在我的,現在是1629935),每個過程都有一小部分。

您可以使用RLIMIT_NOFILE來限制進程(及其子)與setrlimit(2)的文件描述符的數量。 bash內建ulimit調用syscall(在我的系統上,默認情況下,描述符限制爲1024)。

閱讀Advanced Linux Programming

+0

謝謝你,這是我一直在尋找。我有點擔心fileno()必須與打開的大小一樣大或小。然而情況並非如此,因爲尺寸完全不相關。 – RG337

2

通過fileno()返回的文件描述符是一個int,它是用來打開文件的大小無關。

+0

好,所以我可以安全地從它進行預先寫入?即使我用fopen()打開? – RG337

+0

是的;您可以使用'pread()'或'read()'或'readv()'或其他任何使用文件描述符訪問文件的適當函數。 (這意味着你不能使用套接字功能。) –

2

是的,你可以。文件描述符的值與該文件的大小無關。