我正在处理大文件。 (大于;>> 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);
}
答案 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)。