Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1871896
  • 博文数量: 283
  • 博客积分: 10141
  • 博客等级: 上将
  • 技术积分: 2931
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-21 14:33
文章分类

全部博文(283)

文章存档

2013年(2)

2012年(2)

2011年(17)

2010年(36)

2009年(17)

2008年(18)

2007年(66)

2006年(105)

2005年(20)

分类: LINUX

2006-03-27 16:31:53

 

Linux进程中,新的进程是由一个已经存在的进程复制出来的,只有第一个进程是在内核引导完成了基本的初始化工作后就存在的。所以说,Linux系统中的进程都是同一祖先的。

 

1.       进程创建

1.1 进程复制(copy是一种美德,比如DNAcopy带来比较稳定的性状遗传 :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.       ….

阅读(2406) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~