首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>其他编程>正文

Linux0.11进程创建函数fork()

http://www.oklinux.cn  2008-10-07  linuxidc   会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

在Linux中,有一个特殊的函数fork()。这个函数会向父进程返回子进程的进程号PID,而向子进程返回0。有没有想过一个函数怎么可能有两个不同的返回值呢?

#include
#include /* contains fork prototype */
int main(int argc, char **argv) {
if (fork() == 0) {


在Linux0.11中,每个进程都有一个进程控制块结构task_struct。系统支持最多64个进程,定义在全局数组task中。

struct task_struct * task[NR_TASKS] = {&(init_task.task), };


其中进程0为初始进程,其它所有的进程都是通过fork产生的。用户态的fork函数最终调用系统调用sys_fork()。sys_fork()系统调用分成2步完成,第一步调用函数find_empty_process(),在task[]数组中找一项空闲项;第二步调用copy_process()函数,复制进程。

对所有fork()调用产生的进程,通过递增并循环的方式为其分配进程号。有一个全局变量last_pid用来记录上次使用的进程号:

long last_pid=0;

在find_empty_process中,不断递增last_pid,寻找第一个未被其它进程使用的进程号作为新进程的进程号。如果递增后的值超出正数表示范围,则重新从1开始。

进程控制块中还保存有进程的任务状态段数据结构tss,用于存储处理器管理进程的所有信息。也就是说,在任务切换过程中,首先将处理器中各寄存器的当前值被自动保存当前进程的tss中;然后,下一进程的tss被加载并从中提取出各个值送到处理器的寄存器中。由此可见,通过在tss中保存任务现场各寄存器状态的完整映象,实现任务的切换。

struct tss_struct tss;

因此,一旦在task[]数组中找到空闲项和进程号,我们就可以为该进程的进程控制块结构申请一个页面的内存。这个工作是在copy_process()函数中完成的。当然copy_process()函数的最主要的任务是为子进程复制父进程信息,并设置子进程的任务状态段,其中最关键的两步是:

1. 把子进程tss中的eip设置为父进程系统调用返回地址,这样当子进程被调度程序选中后,将从父进程的fork()返回地址处开始执行。

p->tss.eip = eip;

2. 把子进程tss中的eax设置为0,而eax是存放函数返回值的地方,这样子进程中返回的是0。注意子进程并没有执行fork()函数,子进程的系统堆栈没有进行过操作,当然不会有像父进程那样的fork函数调用。但是当子进程开始运行时,就好像它从fork中返回。

p->tss.eax = 0;


上一篇:Linux kernel常用编码模式   下一篇:bochs模拟运行Linux0.11问题及解答

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Linux kernel常用编码模式
·bochs模拟运行Linux0.11问题及解答
·Linux学习笔记之Shell 的重要性
·Linux编程快速入门
·在Linux系统下把文件转换为UTF-8编码
·深入了解C#程序语言
·Linux下编译osip2和eXosip2
·Linux平台下eXosip2编译笔记
·Linux环境Utuntu中java环境变量配置和eclipse配置启动
·Ubuntu下用eclipse cdt编写多线程程序的简单设置[图文
·Linux VIM编辑器及其插件安装
·为ARM Linux添加xml支持
·Linux下删除文本文件中的所有空行
·apue2中源码的使用
·web服务器lighttpd1.4.18代码详细分析
·Linux下常见音频格式之间的转换方法
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·bochs模拟运行Linux0.11问题及解答
·Linux kernel常用编码模式
·Linux学习笔记之Shell 的重要性
·Linux编程快速入门
·在Linux系统下把文件转换为UTF-8编码
·深入了解C#程序语言
·Linux下编译osip2和eXosip2
·Linux平台下eXosip2编译笔记
·Linux环境Utuntu中java环境变量配置和e
·Ubuntu下用eclipse cdt编写多线程程序
·Linux VIM编辑器及其插件安装
·为ARM Linux添加xml支持
  阅读排行
·Linux下Qtopia Core 4.3(QT/E)交叉编译
·Linux编程时获取当前时间实例解析
·开源空间 网络安全工具开发函数库Libne
·Linux环境下OpenGL编程学习
·Linux socket编程实例:echo服务器程序
·升级Redhat Linux 9.0内核有感
·Linux中断处理学习笔记
·Linux环境下重新编译GCC-4.3.0
·GNU/Linux应用程序编程:用管道进行编
·Linux下安装g77 fortran complier过程
·Linux系统中限制用户进程CPU及内存占用
·解决Linux中Matlab中文乱码问题
·Linux多线程编程学习之线程同步
·Linux环境下Wine的中文显示以及freetyp
·SUSE Linux中安装Quartus 7.2过程笔记
网摘收藏: