第一篇:进程的创建与销毁
一.实验目的(1)加深对进程概念的理解和进程创建与撤消算法;
(2)进一步认识并发执行的实质。
二.实验内容
(1)进程管理认识:通过windows “任务管理器”观察进程的状态,进行进程的创建、切换和撤销。
(2)进程创建与撤销:通过系统调用编程实现进程的创建与撤销功能,并在屏幕上观察进程活动的结果。
三.实验步骤
(1)任务分析:
以下是创建进程的关键知识:
进程创建和撤销需要调用CreateProcess()和TerminateProcess()。CreateProcess()实际上是运行一个新的可执行程序,这里,需要设置其必备的参数。而终止进程则首先是要找到运行进程的句柄,然后终止该进程。
(2)程序设计:
a.总体设计:
通过main()函数调用两个函数void startprocess()和函数void
stop_process()。主要是在main()函数中用while循环和开关语句switch选择序号对其进行控制,可以先创建进程并观察然后在选择序号终止该进程。b.具体实现:首先我们必须知道函数CreateProcess()的参数定义(类型和名称),共10个参数,其函数原型为
BOOL CreateProcess
(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes。
LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);
其中第二个参数lpCommandLine参数允许调用者向新应用程序发送数据;STARTUPINFO所必需的,用于在必要时指明新应用程序的主窗口的外观.lpProcessInformation用于调用的结果块和发送新应用程序的进程和主线程的句柄和ID号。其他参数可以按缺省值为空。
判断创建进程是否成功,若不成功,输出创建不成功并返回;若成功则显示程序并获得句柄,以方便终止句柄。在终止进程过程中,若句柄不为空,调用TerminateProcess()进一步判断。
其函数原型
BOOLTerminateProcess(HANDLEhProcess,//handletotheprocess
UINTuExitCode);
(3)程序结果:打印程序的输出结果(表明对应的数据)或主要界面图。
开始时的界面:(如图所示)
输入序号1后 产生的结果:
接着输入序号2后该进程被撤销后的结果:
输入序号3退出程序:
(4)调试与测试:
如果进入主界面时,直接执行序号2终止进程:
上述结果表明 由于事先没有创建进程,所以句柄为空,无法终止进程。
四.实验总结
首先查看“任务管理器”进程的动态,并新建和关闭进程观察。接着是要创建进程和撤销进程,首要工作是我们得弄清楚两个系统函数CreateProcess()和
TerminateProcess()入口参数的类型和函数,弄明白这些关键因素,然后就是如何将它们组织起来,我用的控制台下的switch语句来控制到底进行哪种操作。通过这次试验,我们加深了平时学习的理论知识和实践的联系,并加深了印象。不过,我觉得这次试验如果能够用MFC的消息触发更加直观,有些参数弄的还是不太明白,还需要多多努力。
五.附录源代码
#include
#include
using namespace std;
HANDLE m_hPro;
void startprocess()//创建进程
{
STARTUPINFO si;//必备的参数设置
int n=1;
memset(&si,0,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_SHOW;
PROCESS_INFORMATION pi;
if(!CreateProcess(NULL,“C://Program Files//Internet
Explorer//iexplore.exe”,NULL,NULL,false,0,NULL,NULL,&si,&pi))
{
cout <<“Create Process Fail!” < exit(1); } else { cout <<“Create Process Success!” < m_hPro=pi.hProcess; } } void stop_process() { if(m_hPro){if(!TerminateProcess(m_hPro,0)){ }}} //终止出现错误,显示错误信息 LPVOID lpMsgBuf;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL,(LPTSTR)&lpMsgBuf, 0, NULL);SUBLANG_DEFAULT),else {} m_hPro=NULL;cout<<“TerminateProcess sucess”< int main(){ while(1){ cout<<“请输入序号”< }case 2:stop_process();break;case 3:exit(1);} }return(0); 实验二 进程的创建 一、实验目的 熟悉进程的创建过程,了解系统调用函数fork()和 execl()。 二、实验内容 1、阅读实例代码fork1,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握系统调用fork()的用法,返回值的意义。 2、阅读实例代码fork2,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握在程序中运行一个操作系统命令和运行一个程序的方法。 3、修改fork2,使之能把运行的命令和程序作为参数传给fork2。 三、设计思想 1、程序框架 pid =-1 pid = 0 pid > 0 2、用到的文件系统调用函数 fork()和 execl() 四、调试过程 1、测试数据设计(1)fork1 命名程序1: 编写程序1: 编译程序1: 运行程序1: (2)fork2 编写程序2: 运行程序2: (3)修改fork2 编写修改程序2: 修改后的运行结果: 2、测试结果分析 (1)对于程序1:因为系统调用fork()函数是一次调用两次返回值,而且先生成子进程还是父进程是不确定的,所以第一次执行生成子进程的时候返回的pid = 0,判断pid!=-1,所以输出了I’m the child.I’m the parent.第二次,执行父进程的时候,返回的是子进程的进程号pid > 0,即pid的值仍然不为-1,所以又输出了一次I’m the child.I’m the parent。 (2)对于程序2:第一次调用fork()函数时,由于执行的是子进程还是父进程是随机的,所以第一次对父进程返回的是子进程的进程号(大于0),即pid > 0,所以输出I’m the parent.Program end.当第二次执行子进程时返回值是0,即pid = 0,所以输出I’m the child.并调用了execl()函数,查看了指定路径中的文件。 (3)对于修改后的程序2:改变了系统调用execl()中参数的文件路径和可执行文件名,即可在程序fork2.c中执行另一个程序wyf.c(但要注意可执行文件名是123)。 五、总结 1、调试过程中遇到的主要问题及解决过程 运行程序2的时候如果不加execl()函数的头文件 2、体会和收获 通过这次实验我进一步熟悉了linux系统,也学会了进程的创建过程和返回值的意义。同时学会了一个新的系统调用函数execl()及其头文件和参数类型。也学会了在编写完程序之后,不仅可以用 :wq 保存并退出,也可以用快捷键 shift + zz。 六、附录:源程序代码(另附) 1.进程状态: 1)可运行状态(TASK_RUNNING) 2)可中断的等待状态(TASK_INTERRUPTIBLE) 3)不可中断的等待状态(TASK_UNINTERRUPTIBLE) 4)暂停状态(TASK_STOPPED) 5)僵死状态(TASK_ZOMBIE) 2.进程的创建:1)fork:使用该系统调用时,子进程复制父进程的全部资源。由于要复制父进程进程描述符给子进程(进程描述的结构很大!),这一过程开销是很大的。linux采用了”写时复制技术”(copy on write,COW),使子进程先共享父进程的物理页,只有子进程进行写操作时,再复制对应的物理页,避免了无用的复制开销,提高了系统的性能。 实现代码(x86):arch/x86/kernel/process.c int sys_fork(struct pt_regs *regs) { Return do_fork(SIGCHLD, regs->sp, regs,0, NULL, NULL); } 2)vfork:该系统调用创建的子进程,完全运行在父进程地址空间之上。子进程对地址空间任何数据的修改同样为父进程所见。vfork执行后父进程堵塞,知道子进程运行结束。 实现代码(x86):arch/x86/kernel/process.c int sys_vfork(struct pt_regs *regs) { Return do_fork(CLONE_VFORK | CLONE_VM |SIGCHLD, regs->sp, regs, 0,NULL, NULL); } 3)clone:该调用是linux系统所特有的,其NPTL的实现依赖此函数。与fork,vfork相比clone对进程创建有更好的控制能力,能控制子进程和父进程共享何种资源。 实现代码(x86):arch/x86/kernel/process.c long sys_clone(unsignedlong clone_flags, unsigned long newsp,void__user *parent_tid, void__user *child_tid, structpt_regs *regs){ if(!newsp) newsp = regs->sp; Return o_fork(clone_flags, newsp, regs, 0,parent_tid, child_tid);} 上面进程的创建最终依赖于:do_fork(),只是向其传递了不同的参数clone_flags,其原型为: long do_fork(unsigned long clone_flags,unsigned long stack_start,struct pt_regs *regs,unsigned long stack_size,int __user *parent_tidptr,int __user *child_tidptr) 参数分析: clone_flags:低字节指定子进程结束时发送到父进程的信号代码,通常选择SIGCHLD信号。剩余3个字节给一clone标志组用于编码 stack_start:子进程用户态堆栈的地址 regs:指向内核态堆栈通用寄存器值的指针,通用寄存器的值是在从用户态切换到内核态时被保存到内核态堆栈中的。 stack_size:未使用,总被设置为0。 parent_tidptr:表示父进程的用户态变量地址,该父进程具有与新轻量级进程相同的PID。 child_tidptr:表示新轻量级进程的用户态变量地址,该进程具有这一类进程的PID。只有在CLONE_CHILD_SETTID被设置时才有意义。 而do_fork()函数生成一个新的进程,大致分为三个步骤。 1、建立进程控制结构并赋初值,使其成为进程映像。 2、必须为新进程的执行设置跟踪进程执行情况的相关内核数据结构。包括任务数组、自由时间列表 tarray_freelist 以及 pidhash[] 数组。 3、启动调度程序,使子进程获得运行的机会。 档案鉴定与销毁制度 1、档案鉴定要根据《档案法》的要求,以“审查从细,留存从宽”为原则,既考虑历史发展的需要,又服务于现实工作。 2、档案鉴定工作要在局领导小组的鉴定下有组织有计划地进行。鉴定小组的任务是:指导、监督鉴定工作,讨论、审查、销毁、清册,对档案存毁做出决定,并报请局领导批准。 3、对已超过保管期限的档案,应当按照规定进行直接鉴定。鉴定中,不能只看案卷标题,而应从档案的实际情况出发,具体分析档案的价值,逐卷、逐件进行审查。对需要销毁的档案,应编造销毁清册,报鉴定小组和领导审批。 4、销毁档案,必须按照审批程序,经局领导审查签字盖章后再销毁。 5、批准销毁的档案,应送往指定的造纸厂做原料,且要有2名以上工作人员监销核销,销毁完毕,监销人在销毁清册审批表上签字。 6、鉴定工作结束后,必须形成鉴定工作报告。鉴定工作报告和档案销毁清册应归入单位全宗卷,存档备查。 麻醉精神药品回收与销毁 一.空安瓿(贴)的回收及销毁 空安瓿(空贴)均需回收 专人计数、监督销毁,做好记录 《医疗机构麻醉药品、第一类精神药品管理规定》 第二十七条 患者使用麻醉药品、第一类精神药品注射剂或者贴剂的,再次调配时,应当要求患者将原批号的空安瓿或者用过的贴剂交回,并记录收回的空安瓿或者废贴数量。 第二十八条 医疗机构内各病区、手术室等调配使用麻醉药品、第一类精神药品注射剂时应收回空安瓿,核对批号和数量,并作记录。 第二十九条 收回的麻醉药品、第一类精神药品注射剂空安瓿、废贴由专人负责计数、监督销毁,并作记录。 第三十条 患者不再使用麻醉药品、第一类精神药品时,医疗机构应当要求患者将剩余的麻醉药品、第一类精神药品无偿交回医疗机构,由医疗机构按照规定销毁处理。 二.科室、患者药品的回收 剩余的药品:科室应退库; 患者应无偿交回。 《医疗机构麻醉药品、第一类精神药品管理规定》 □ 第二十八条 医疗机构内各病区、手术室等……剩余的麻醉药品、第一类精神药品应办理退库手续。 □ 第三十条 患者不再使用麻醉药品、第一类精神药品时,医疗机构应当要求患者将剩余的麻醉药品、第一类精神药品无偿交回医疗机构,由医疗机构按照规定销毁处理。 三.药品的销毁 第十三条 医疗机构对过期、损坏麻醉药品、第一类精神药品进行销毁时,应当向所在地卫生行政部门提出申请,在卫生行政部门监督下进行销毁,并对销毁情况进行登记。 卫生行政部门接到医疗机构销毁麻醉药品、第一类精神药品申请后,应当于5日内到场监督医疗机构销毁行为。第二篇:进程创建实验报告
第三篇:进程创建函数分析
第四篇:档案鉴定与销毁制度
第五篇:麻醉精神药品回收与销毁