fork
and exec
fork
- 是父进程调用的
- 创建子进程
- 子进程的内存空间内容和父进程一致
fork
返回时刻不保证先后顺序
exec
- 是子进程调用的
- 使得内存空间被替换并映射到指定可执行文件
- 保留 file table。需要注意的是,子进程需要按需关闭文件描述符以避免资源泄露。
为什么不合并这两个调用
- 方便I/O重定向。I/O重定向是很常见的一种操作,例如实现
Pipe机制
或者cat命令
都需要用到I/O重定向。 - 虚拟内存技术可以使用CoW优化性能,因此性能开销并不大。也就是说,对于没有更改内容的虚拟页,操作系统只需要维护一个页表条目,而不必拷贝一个副本。
关于虚拟内存
sbrk(n)
可以增大操作系统分配的内存块。一般使用malloc时,如果仍有可以分配的区域,则不需要使用sbrk系统调用。
保留的文件描述符
0 - 标准输入
1 - 标准输出
2 - 标准错误
POSIX
OS X 10.5开始已经POSIX兼容,相关系统调用定义在<unistd.h>
内。
Unix最早于1970年代由贝尔实验室写出来,然后他们又以慷慨的条款向学校提供代码,再后来就出现了很多有影响力的分支版本,接着又有了许多不兼容的系统调用。为了阻止这种孤岛势头,使得程序能够在不同系统之间迁移,IEEE提出了POSIX标准,试图统一系统调用及其语义。