算法 fork,无输入参数,父进程返回子进程PID,子进程返回0
{ 检查可用的内核资源;
取一个空闲的进程表项和惟一的PID号;
检查用户没有过多运行进程;
将子进程的状态设置为“创建”状态;
将父进程进程表项的数据拷贝到子进程进程表项中;
当前目录和根目录的索引节点引用计数加1;
文件表中打开文件的引用计数加1;
在内存中作父进程上下文的拷贝;
fork的算法描述(续)
在子进程的系统级上下文中压入虚设系统级上下文层;
if (正在执行的进程是父进程)
{ 将子进程的状态设置为“就绪”状态;
return(子进程的PID);
}
else {
初始化U区的计时域;
return(0);
}}
系统调用exec
exec系列中的系统调用都完成同样的功能,它们把一个新的程序装入调用进程的内存空间,以改变调用进程的执行代码,从而使调用进程执行新引入的程序功能。
这一组系统调用的主要差别在于给出参数的数目和形式不同。下面给出两种基本的exec调用格式说明:
int execl(path , arg0 [,arg1,…,argn],0);
char *path,*arg0,*arg1, …,*argn ;
int execv(path,argv);
char *path,*argv[ ];
exec算法描述
算法 exec,输入参数有文件名、参数表、环境变量,无输出。
{ 取文件的索引节点(算法namei);
验证文件可被执行,用户有执行许可权;
读文件头,检查它是否为装入模块;
将exec参数从老地址空间拷贝到系统空间;
for (与该进程附接的每个区)
使区与进程断接(算法detachreg);
for (装入模块中指定的每个区);
{ 分配新区(算法alloreg);
exec算法描述(续)
将新区附接到进程(算法attachreg);