磁盘中存储的数据
文件系统:设计目标
“存储设备 (字节序列) 的虚拟化”
std::vector<char>
(随机读写/resize)文件:虚拟的磁盘
文件描述符:进程访问文件 (操作系统对象) 的 “指针”
void *mmap(
void *addr, size_t length, int prot, int flags,
int fd, off_t offset // 映射 fd 文件
); // offset 开始的 length 字节
文件是 “虚拟磁盘”
小问题
SIGBUS
...文件的读写自带 “游标”,这样就不用每次都指定文件读/写到哪里了
例子
read(fd, buf, 512);
- 第一个 512 字节read(fd, buf, 512);
- 第二个 512 字节lseek(fd, -1, SEEK_END);
- 最后一个字节mmap, lseek, ftruncate 互相交互的情况
length
= 2 MiB)SEEK_SET
)在任何时刻,写入数据的行为是什么?
文件描述符在 fork 时会被子进程继承。
父子进程应该共用偏移量,还是应该各自持有偏移量?
offset
存储在哪里考虑应用场景
write
的原子性 ✅操作系统的每一个 API 都可能和其他 API 有交互 😂
O_APPEND
方式打开的文件,偏移量永远在最后 (无论是否 fork)这也是 fork 被批评的一个原因
fork()
in the road