fileno()和大于2GB的文件

时间:2014-03-07 05:32:20

标签: c linux file-io

我正在处理大文件。 (大于;>> 2GB)。我的问题是,如果文件大于sizeof(int),那么在文件描述符上使用fileno()是否安全?

这是一个快速的代码段:

#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);
}

3 个答案:

答案 0 :(得分:2)

fileno()返回的文件描述符为int,无论用于打开的文件大小如何。

答案 1 :(得分:2)

是的,你可以。文件描述符的值与该文件的大小无关。

答案 2 :(得分:1)

fileno(3)一旦fopen - 编辑了 stdio FILE流,就会得到file descriptor - 一个固定的小整数。一个进程通常只有几十个文件描述符,偶尔(对于某些服务器,请参阅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