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