文件空洞


做《TLPI》第四章的最后习题的时候,体会到内容。

常规的I/O操作有open(),read(),write(),close()还有比较特殊的lseek(),ioctl()。

linux在读写一个文件的时候都会通过一个 “文件偏移量”来确定在哪个位置读写,英文是offset,

而lseek()则可以控制这个offset的值,来达到操控文件读写初始位置的目的。

而如果将offset设置得足够大,即超过了储存的文本长度,再对文件进行写入(write)也是合理的。那么常规文本末尾和offset后填入的第一个字符之间的空隙则为空,成为文件空洞

这种含有文件空洞得文件我们一般叫做稀疏文件。稀疏文件一般用在需要提前占好磁盘空间的情况,比如虚拟机分配磁盘大小,下载文件的时候提前站好空间,文件空洞则之后在进行填充。

int stat(const char *pathname, struct stat *statbuf);//这个函数可以获取文件的各种信息,(一定要熟用man这个指令啊)

struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* Inode number */
mode_t st_mode; /* File type and mode */
nlink_t st_nlink; /* Number of hard links */
uid_t st_uid; /* User ID of owner */
gid_t st_gid; /* Group ID of owner */
dev_t st_rdev; /* Device ID (if special file) */
off_t st_size; /* Total size, in bytes */
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated */

/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */

struct timespec st_atim; /* Time of last access */
struct timespec st_mtim; /* Time of last modification */
struct timespec st_ctim; /* Time of last status change */

#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};

相关