1. 文件描述符


int open(const char *pathname, int flags);

RTFM: O_CLOEXEC, O_APPEND

<aside> 📖 文件描述符

一个指向操作系统内对象的 “指针”

</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>

2. 状态机、fork() 和魔法


<aside> 📖 创建平行宇宙

3. 状态机复制:我们做对了吗?


<aside> 📖 fork(): UNIX 时代的遗产

fork + execve

在操作系统的演化过程中,为进程增加了更多的东西