int open(const char *pathname, int flags);
RTFM: O_CLOEXEC, O_APPEND
<aside> 📖 文件描述符
一个指向操作系统内对象的 “指针”
对象只能通过操作系统允许的方式访问
从 0 开始编号 (0, 1, 2 分别是 stdin, stdout, stderr)
可以通过 open 取得;close 释放;dup “复制”
对于数据文件,文件描述符会 “记住” 上次访问文件的位置
write(3, "a", 1); write(3, "b", 1);
</aside>
fd = open("a.txt", O_WRONLY | O_CREAT); assert(fd > 0);
pid_t pid = fork(); assert(pid >= 0);
if (pid == 0) {
write(fd, "Hello");
} else {
write(fd, "World");
}
<aside> 📖 文件抽象的代价
<aside> 📖 复制,但又没有完全复制
概念上状态机被复制,但实际上复制后内存都被共享
所以,整个操作系统里 libc 代码和只读数据只有一个副本!
推论:统计进程占用的内存是个伪命题
</aside>
<aside> 📖 创建平行宇宙
<aside> 📖 fork(): UNIX 时代的遗产
fork + execve
在操作系统的演化过程中,为进程增加了更多的东西