为什么 pread 接受偏移值时需要 lseek?
Why do we need lseek when pread accepts offset value?
我无法理解为什么 lseek
函数很有用。
假设我从用户那里得到了这样的参数:
off_t offset = 10;
我想从偏移量中读取 100 个字节。
我可以这样使用 pread
:
void * buf = malloc(100);
if (buf == NULL) { exit(1);}
int res = pread(file_id, buf, 100, offset);
另一方面,我知道我可以像这样用 lseek
设置文件:
off_t seek = lseek(file_id, offset, SEEK_SET);
所以我相信我已经使用 pread
实现了阅读。关于 lseek
它可以帮助我阅读文件,我错过了什么?
函数可能必须 read/write from/to 给定文件句柄位于它不知道的位置(比如当前位置),因此您需要将查找与读取(或写入)分开) 因为调用方可能需要设置位置。
更一般地说,许多 I/Os 只是连续的,因此不需要查找,而 pread
强制查找。
我无法理解为什么 lseek
函数很有用。
假设我从用户那里得到了这样的参数:
off_t offset = 10;
我想从偏移量中读取 100 个字节。
我可以这样使用 pread
:
void * buf = malloc(100);
if (buf == NULL) { exit(1);}
int res = pread(file_id, buf, 100, offset);
另一方面,我知道我可以像这样用 lseek
设置文件:
off_t seek = lseek(file_id, offset, SEEK_SET);
所以我相信我已经使用 pread
实现了阅读。关于 lseek
它可以帮助我阅读文件,我错过了什么?
函数可能必须 read/write from/to 给定文件句柄位于它不知道的位置(比如当前位置),因此您需要将查找与读取(或写入)分开) 因为调用方可能需要设置位置。
更一般地说,许多 I/Os 只是连续的,因此不需要查找,而 pread
强制查找。