分类: LINUX
2006-03-27 16:31:53
Linux进程中,新的进程是由一个已经存在的进程复制出来的,只有第一个进程是在内核引导完成了基本的初始化工作后就存在的。所以说,Linux系统中的进程都是同一祖先的。
1. 进程创建
1.1 进程复制(copy是一种美德,比如DNA的copy带来比较稳定的性状遗传 :p)
复制出来的子进程的task_struct结构与系统的堆栈空间是与父进程独立的,但其他资源却是与父进程共享的,比如文件指针,socket描述符等。
这里要提到几个系统调用,fork()与clone(),以及vfork()。Fork()无参数,将父进程资源全部复制,而clone()有参数,可以有选择地复制部分资源。Vfork()复制的是除了task_struct结构和系统堆栈外所有的资源,所以vfork()出来的算是线程。
但是有一点要说清楚,现在的Linux做进程复制,只复制基本资源,而对于父进程的代码、全局变量等,暂时不复制,做只读访问,当需要修改时才进行复制,这就是所谓的copy_on_write。
1.2 目标代码的执行
系统调用execve()让进程执行一个可执行程序的映象。
2. 进程的消亡
子进程比父进程消亡得早,会通过内核给父进程发一个信号。父进程也可以等待子进程消亡后再继续执行,也可以exit()。父进程使用wait4()等待特定子进程结束,wait3()等待任何一个子进程结束。
3. 几个系统调用
(1) fork()对父进程返回子进程的ID号,对子进程返回0。
(2) 系统中的sys_fork(),sys_clone(),sys_vfork()都是通过do_fork()来完成的。
(3) glibc里的fork调用的sys_clone()…
4. ….