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标准,试图统一系统调用及其语义。