欢迎来到天天文库
浏览记录
ID:35626137
大小:149.00 KB
页数:26页
时间:2019-04-03
《操作系统课程设计报告--Linux的fork.c代码的分析 Linux的exit.c代码的分析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、成绩:____《操作系统原理》课程设计报告设计题目Linux的fork.c代码的分析Linux的exit.c代码的分析姓名班级学号负责人:参与人:指导老师:一、设计目的:通过对Linux的fork.c、exit.c代码的分析,了解一个操作系统进程的创建、退出的过程,锻炼学生分析大型软件代码的能力通过与同组同学的合作,锻炼学生的合作能力二、设计步骤:1.了解基础知识;2.与同组同学一起讨论出任务的分配方式;马瑞骁(计023-37):Release()函数、Sys_kill()函数、Tell_father()函数,Sys_waitpid()函数董欣(计022-24):、Copy_progress函
2、数,Fork.c程序流程图、Exit.c程序流程图;3.对自己的任务部分的代码充分阅读,注释代码,同时得到相应的框图;4.撰写报告。三、设计内容:根据课程设计指导书提供的基础知识和有关资料,分析相关代码,得到相关的框图,写出设计报告。四、设计结果:(一)Exit.c分析:Exit.c程序主要描述了进程终止和退出的处理事宜。主要包含进程释放、会话终止和程序推出处理函数以及杀死进程、终止进程、刮起进程等系统调用函数。还包括进程信号发送函数send_sig()和同志父进程终止的函数tell_father()。26Exit.c程序流程图:26释放当前进程占内存页当前进程是否有子进程子进程是否处于僵死状
3、态发送终止信号子进程的father置1是否为最后一个进程否关闭打开的所有文件是否是否是进行同步操作,释放当前进程是否是会话进程且控制终端释放该终端26终止该会话的相关进程当前进程是否是leader进程当前进程置为僵死状态向父进程发送信号SIGHLD重新调度进程否是1.Release()函数:Release()主要根据制定的任务数据结构(任务描述符)指针,在任务数组中删除指定的进程指针、释放相关内存页并立刻让内核重新调度任务的运行。/*************程序分析************************/voidrelease(structtask_struct*p)//参数p是任务
4、数据结构的指针。该函数在后面的sys_ki1l()和sys_waitPid()中被调用。//扫描任务指针数组表task26「」以寻找指定的任务。若找到,则先清空该任务槽,然后释放该任务数据结构所占用的内存页面,最后执行调度函数并在返回时立即退出。若在任务数组表中没有找到指定任务对应的项,则内核panic{inti;if(!p)return;for(i=1;i5、;}panic("tryingtoreleasenon-existenttask");//指定任务若不存在则死机}/****************************************************/Release()程序框图如下所示:26入口(*P)P是否空返回扫描任务存在否置空任务并释放网页是否否是i6、/intsys_kill(intpid,intsig)//参数pid是进程号;sig是需要发送的信号。26{structtask_struct**p=NR_TASKS+task;interr,retval=0;if(!pid)//如果pid=0,那么信号就会被发送给当前进程的进程组中的所有进程。while(--p>&FIRST_TASK){if(*p&&(*p)->pgrp==current->pid)if(err=send_sig(sig,*p,1))//强制发送信号。retval=err;}elseif(pid>0)//如果pid值>0,则信号被发送给进程号是pid的进程。while(--7、p>&FIRST_TASK){if(*p&&(*p)->pid==pid)if(err=send_sig(sig,*p,0))retval=err;}elseif(pid==-1)while(--p>&FIRST_TASK)//如果pid=-1,则信号sig就会发送给除第一个进程外的所有进程。if(err=send_sig(sig,*p,0))retval=err;elsewhile(--p>&F
5、;}panic("tryingtoreleasenon-existenttask");//指定任务若不存在则死机}/****************************************************/Release()程序框图如下所示:26入口(*P)P是否空返回扫描任务存在否置空任务并释放网页是否否是i6、/intsys_kill(intpid,intsig)//参数pid是进程号;sig是需要发送的信号。26{structtask_struct**p=NR_TASKS+task;interr,retval=0;if(!pid)//如果pid=0,那么信号就会被发送给当前进程的进程组中的所有进程。while(--p>&FIRST_TASK){if(*p&&(*p)->pgrp==current->pid)if(err=send_sig(sig,*p,1))//强制发送信号。retval=err;}elseif(pid>0)//如果pid值>0,则信号被发送给进程号是pid的进程。while(--7、p>&FIRST_TASK){if(*p&&(*p)->pid==pid)if(err=send_sig(sig,*p,0))retval=err;}elseif(pid==-1)while(--p>&FIRST_TASK)//如果pid=-1,则信号sig就会发送给除第一个进程外的所有进程。if(err=send_sig(sig,*p,0))retval=err;elsewhile(--p>&F
6、/intsys_kill(intpid,intsig)//参数pid是进程号;sig是需要发送的信号。26{structtask_struct**p=NR_TASKS+task;interr,retval=0;if(!pid)//如果pid=0,那么信号就会被发送给当前进程的进程组中的所有进程。while(--p>&FIRST_TASK){if(*p&&(*p)->pgrp==current->pid)if(err=send_sig(sig,*p,1))//强制发送信号。retval=err;}elseif(pid>0)//如果pid值>0,则信号被发送给进程号是pid的进程。while(--
7、p>&FIRST_TASK){if(*p&&(*p)->pid==pid)if(err=send_sig(sig,*p,0))retval=err;}elseif(pid==-1)while(--p>&FIRST_TASK)//如果pid=-1,则信号sig就会发送给除第一个进程外的所有进程。if(err=send_sig(sig,*p,0))retval=err;elsewhile(--p>&F
此文档下载收益归作者所有