24.Linux/Unix 系统编程手册(上) -- 进程的创建

1.fork, exit, wait, execve 简介
	1.fork() 允许一进城创建一个子进程。子进程获取父进程的栈,数据段,堆和执行文本段。
	2.exit() 终止一进程,将进程占用的所有资源归还内核。
	  库函数 exit() 位于系统调用 _exit() 之上。父子进程一般只有一个会通过调用 exit() 退出,
	而另外一个进程则应该使用 _exit() 终止。
	3.系统调用 wait(&status)的目的有二:其一,如果子进程尚未调用 exit 终止,那么 wait() 会挂起父进程,
	  直到子进程终止。其二,子进程的终止状态通过 wait 的 status 参数返回。
	4.系统调用 execve(pathname, argv, envp) 加载一个新的程序(路径名为 pathname, 参数列表为 argv, 环境变量为 envp)
      到当前进程的内存。这将丢弃现存的程序文本段,并为新程序重新创建栈,数据段以及堆。
    5.vfork() 将保证子进程优先于父进程获得调度使用 cpu. 现在不建议使用。

2.fork 的内存语义
	fork 之后常常伴随着 exec, 这会用新程序替换进程的代码段,并重新初始化其数据段,堆段和栈段。大多数现代 Unix 系统使用
  2种技术避免这种浪费:
  1.内核将每个进程的代码段标记为只读,从而使得进程无法修改自身的代码。
  2.对于父进程数据段,堆段和栈段中的个页,内核采用写时复制(copy-on-write)技术来处理。最初内核做了一些设置,令这些段的页表项
    指向与父进程相同的物理内存页,并将这些页面自身标记为只读。调用 fork 后,内核会捕获所有父进程或者子进程对这些页面的修改企图,
    并将要修改的页面创建拷贝页。系统将新的拷贝页分配给遭内存捕获的进程,还会对子进程的相关页表进行适当的调整。


猜你喜欢

转载自blog.csdn.net/enlyhua/article/details/82918545