1、操作系统课程设计进程的创建 计算机学院网络工程专业 操作系统课程设计报告进程的创建 (2012/2013学年 第一学期)2012年 12 月 30日目录第一章 课程设计概述 11.1 课程设计的目的与意义 11.1.1 目的 11.1.2 意义 11.2 实验概述 11.2.1 实验名称 11.2.2 实验目的 11.2.3 实验要求 11.2.4 实验内容 2第二章API函数简介 32.1 API的定义 32.2 windows API 32.3开放API函数 3第三章 相关API函数 53.1 CreateProcess() 53.2 GetVersionEX() 73.3 Release
2、Mutex() 83.4 ExitProcess() 83.5 GetexitCodeProcess() 83.6 STARTUPINFO结构 93.7 PROCESS_INFORMATION 结构 123.8 GetStartupInfo 123.9 ShowWindow 133.10 InternetGetConnectedState 13第四章 实验结果与分析 144.1 实验结果 144.2 实验结果分析 16结束语 18参考文献 19附录 20第一章 课程设计概述1.1 课程设计的目的与意义1.1.1 目的本课程设计是为了配合操作系统课程的理论教学而设置的,目的是通过课程设计的综合训
3、练,加强学生对操作系统概念的实际应用技能的训练,提高学生分析问题和解决问题的能力。1.1.2 意义本次操作系统课程设计的主要任务是进行系统级的程序设计。本课程设计是操作系统原理课程的延伸。通过该课程设计,使学生更好地掌握操作系统各部分结构、实现机理和各种典型算法,加深对操作系统的设计和实现思路的理解,培养学生的系统设计和动手能力,学会分析和编写程序。课程设计的实施将使学生在以下几个方面有所收获: (1)加深对操作系统原理的理解,提高综合运用所学知识的能力; (2)培养学生自主查阅参考资料的习惯,增强独立思考和解决问题的能力; (3)通过课程设计,培养严谨的科学态度和协作精神。1.2 实验概述1
4、.2.1 实验名称 进程的创建,获取进程的PID和操作系统的版本信息。1.2.2 实验目的 (1)通过编写程序实现进程的创建,使用进程和操作系统的版本信息,进程的终止,使学生进一步掌握进程调度的概念,加深对处理机分配的理解。 (2)了解Windows 2000/XP中进程(线程)调度算法,掌握相应的与调度相关的API函数。1.2.3 实验要求 (1)Windows 2000 Professional,Visual C+; (2)了解进程的概念,并理解进程的调度与访问; (3)程序界面美观。1.2.4 实验内容在Windows XP,Windows 2000等操作系统下,语言不限,最好为C或者C
5、+,应用API函数,编写进程的创建,进程使用,进程终止操作。第二章API函数简介2.1 API的定义 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。2.2 windows API Windows API是一套用来控制Windows的各个部件的外观和行为的预先定义的Windows函数。用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么。 这在某种程度上很像Windows的天然代码。而其他的语言只
6、是提供一种能自动而且更容易的访问API的方法。当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体,VB获取这个调用并经过分析后生成一个特定事件。 API函数包含在Windows系统目录下的动态连接库文件中。 更易理解来说:Windows系统除了协调应用程序的执行、内存的分配、系统资源的管理外,同时他也是一个很大的服务中心。调用这个服务中心的各种服务(每一种服务就是一个函数)可以帮助应用程序达到开启视窗、描绘图形和使用周边设备等目的,由于这些函数服务的对象是应用程序,所以称之为Application Programming Interface,简称API 函数。WIN32 API也就
7、是MicrosoftWindows 32位平台的应用程序编程接口。 2.3开放API函数基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用。对外提供的API 调用使得站点之间的内容关联性更强,同时这些开放的平台也为用户、开发者和中小网站带来了更大的价值。开放是目前的发展趋势,越来越多的产品走向开放。目前的网站不能靠限制用户离开来留住用户,开放的架构反而更增加了用户的粘性。在Web 2.0的浪潮到来之前,开放的API 甚至源代码主要体现在桌面应用上,而现在越来越多的Web 应用面向开发者开放了API。 具备分享、标准、去中心化、开放、模块化的Web 2.0
8、 站点,在为使用者带来价值的同时,更希望通过开放的API 来让站点提供的服务拥有更大的用户群和服务访问数量。站点在推出基于开放API 标准的产品和服务后,无需花费力气做大量的市场推广,只要提供的服务或应用出色易于使用,其他站点就会主动将开放API 提供的服务整合到自己的应用之中。同时,这种整合API 带来的服务应用,也会激发更多富有创意的应用产生。 为了对外提供统一的API 接口,需要对开发者开放资源调用API 的站点提供开放统一的API接口环境,来帮助使用者访问站点的功能和资源。 当然,开放API 的站点为第三方的开发者提供良好的社区支持也是很有意义的,这有助于吸引更多的技术人员参与到开放的
9、开发平台中,并开发出更为有趣的第三方应用。视频云技术提供商CC视频开放API接口,用户可以在自己的网站后台轻松完成视频的上传、视频播放控制操作,并可批量获取视频及平台信息。第三章 相关API函数这个课程设计是基于API函数的,下面介绍在这个课程设计的过程中需要了解并理解的有关函数。3.1 CreateProcess()1)定义: WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。2)函数原型:BOOL CreateProcess ( LPCTSTRlpApplicationName, LPTSTRlpCommandLine, LPS
10、ECURITY_ATTRIBUTESlpProcessAttributes, LPSECURITY_ATTRIBUTESlpThreadAttributes, BOOLbInheritHandles, DWORDdwCreationFlags, LPVOIDlpEnvironment, LPCTSTRlpCurrentDirectory, LPSTARTUPINFOlpStartupInfo, LPPROCESS_INFORMATIONlpProcessInformation );3)函数参数: (1)lpApplicationName指向一个NULL结尾的、用来指定可执行模块的字符串。这个字
11、符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。 这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处lpCommandLine 参数的最前面并由空格符与后面的字符分开。 (2)lpCommandLine指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。 这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpC
12、ommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。(3)lpProcessAttributes 指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。 在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。在Windows95中:
13、SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员被忽略。 (4)lpThreadAttributes 指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的指向线程的句柄可以被子进程继承。如果lpThreadAttributes参数为空(NULL),那么句柄不能被继承。 在Windows NT中,SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了主线程的安全描述符,如果参数为空,主线程使用默认的安全描述符。在Windows95中:SECURITY_ATTRIBUTES结构的lpSecur
14、ityDescriptor成员被忽略。 (5)bInheritHandles指示新进程是否从调用进程处继承了句柄。 如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。 (6)dwCreationFlags 指定附加的、用来控制优先类和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。 (7)lpEnvironment 指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。 一个环境块存在于一个由以NULL结尾的字符串组成的块中,这个块也是以NULL结尾的。每个字符串都是name=valu
15、e的形式。因为相等标志被当做分隔符,所以它不能被环境变量当做变量名。(8)lpCurrentDirectory指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。 (9)lpStartupInfo 指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。(10)lpProcessInformation 指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。4
16、)返回值:如果函数执行成功,返回非零值。如果函数执行失败,返回零,可以使用GetLastError函数获得错误的附加信息。 3.2 GetVersionEX()1)函数功能:GetVersionEx函数是获得操作系统版本号信息的方法,它取代了GetVersion函数的功能。2)函数原型: BOOL GetVersionEx( LPOSVERSIONINFO lpVersionInformation;/指向版本信息结构体的指针);3)参数说明: lpVersionInformation :指向一个OSVERSIONINFO数据结构的指针,用于填充操作系统版本信息。在调用GetVersionEx函
17、数之前,先将OSVERSIONINFO数据结构的dwOSVersionInfoSize成员设置为为sizeof(OSVERSIONINFO)。 4)返回值: 如果函数成功,返回值为非零。如果函数失败,返回值为零,为了获得更多错误信息,可调用GetLastError函数。如果给OSVERSIONINFO结构体的dwOSVersionInfoSize成员指定一个无效值,函数将失败。 3.3 ReleaseMutex()1)定义:ReleaseMutex函数的功能是释放互斥对象。一个线程释放了互斥对象后,如果其他进程在等待互斥对象置位,则等待的线程可以得到该互斥对象,等待函数返回,互斥对象被新的线程
18、所拥有。2)函数原型:BOOL WIANPI ReleaseMutex( HANDLE hMutex ); 3)返回值:TRUE表示成功,FALSE表示失败。 4)参数说明:hMutex:HANDLE,制定一个互斥体的句柄。3.4 ExitProcess()1)定义:终止一个进程2)VB声明:Declare Sub ExitProcess Libkernel32 Alias ExitProcess (ByVal uExitCode As Long) 3.5 GetexitCodeProcess()1)定义:获取一个已中断进程的退出代码 2)函数原型:BOOL WINAPI GetExitCod
19、eProcess( _in HANDLE hProcess, _out LPDWORD lpExitCode ); 3)VC声明:BOOL GetExitCodeProcess( HANDLE hProcess, LPDWORD lpExitCode );4)参数说明:hProcess Long,想获取退出代码的一个进程的句柄 lpExitCode Long,用于装载进程退出代码的一个长整数变量。如进程尚未中止,则设为常数STILL_ACTIVE5)返回值:Long,非零表示成功,零表示失败。设置GetLastError 3.6 STARTUPINFO结构STARTUPINFO结构,用于指定新
20、进程的主窗口特性。1)结构的定义:typedef struct _STARTUPINFO DWORD cb;DWORD dwX;DWORD dwY;DWORD dwXSize;DWORD dwYSize; DWORD dwXCountChars;DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; STARTUP
21、INFO, *LPSTARTUPINFO;2)函数参数说明:(1)DWORD cb:包含STARTUPINFO结构中的字节数.如果Microsoft将来扩展该结构,它可用作版本控制手段。应用程序必须将cb初始化为sizeof(STARTUPINFO) (2)PSTR lpReserved:保留,必须初始化为N U L L (3)PSTR lpDesktop:用于标识启动应用程序所在的桌面的名字。如果该桌面存在,新进程便与指定的桌面相关联。如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。如果lpDesktop是NULL(这是最常见的情况),那么该进程将与当前桌面相关联。(
22、4)PSTR lpTitle:用于设定控制台窗口的名称。如果l p Ti t l e 是N U L L ,则可执行文件的名字将用作窗口名 (5)DWORD dwX:用于设定应用程序窗口在屏幕上应该放置的位置的x 和y 坐标(以像素为单位)。 (6)DWORD dwY:只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时,才使用这两个坐标。若是创建控制台窗口的应用程序,这些成员用于指明控制台窗口的左上角 (7)WORD dwXSize和DWORD dwYSize:用于设定应用程序窗口的宽度和长度(以像素为位)(8)DWORD dwXCountCh
23、ars:用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位) (9)DWORD dwYCountChars和DWORD dwFillAttribute:/用于设定子应用程序的控制台窗口使用的文本和背景颜色 (10)WORD wShowWindow:用于设定子应用程序初次调用的S h o w Wi n do w 将S W _ S H O W D E FA U LT 作为n C m d S h o w 参数传递时,该应用程序的第一个重叠窗口应该如何出现。 (11)WORD cbReserved2:保留。必须被初始化为0 (12)PBYTE lpReserved2:保留。必须被初始化为N U
24、L L 3.7 PROCESS_INFORMATION 结构在创建进程时相关的数据结构之一,该结构返回有关新进程及其主线程的信息。1)结构定义如下: typedef struct_PROCESS_INFORMATION HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId;PROCESS_INFORMATION; 2)成员函数说明:(1)hProcess:返回新进程的句柄。 (2)hThread:返回主线程的句柄。 (3)dwProcessId:返回一个全局进程标识符。该标识符用于标识一个进程。从进程被创建到终
25、止,该值始终有效。 (4)dwThreadId:返回一个全局线程标识符。该标识符用于标识一个线程。从线程被创 建到终止,该值始终有效。3.8 GetStartupInfo1)函数功能: 该函数返回进程在启动时被指定的 STARTUPINFO 结构。2)函数原型 VOID GetStartupInfo( LPSTARTUPINFO lpStartupInfo); 3)参数说明:lpStartupInfo :用来存放要获取的 STARTUPINFO 结构 4)返回值 :该函数没有返回值 3.9 ShowWindow1)函数功能:该函数设置指定窗口的显示状态。 2)函数原型:BOOL ShowWin
26、dow(HWND hWnd, int nCmdShow);3)返回值:如果窗口当前可见,则返回值为非零。如果窗口当前被隐藏,则返回值为零。3.10 InternetGetConnectedState1)函数功能:用以返回本地系统的网络连接状态。2)函数原型:BOOL InternetGetConnectedState(_out LPDWORD lpdwFlags, _in DWORD dwReserved,);3)函数参数说明: lpdwFlags:指向一个变量,该变量接收连接描述内容。该参数在函数返回FLASE时仍可以返回一个有效的标记。4)返回值 当存在一个modem或一个LAN连接时,返
27、回TRUE,当不存在internet连接或所有的连接当前未被激活时,返回false。第4章 实验结果与分析4.1 实验结果进程的创建,创建的是在联网和未联网的状态下分别调用IE浏览器的进程。如下图4.1和4.2所示,是在联网情况下的运行结果。调用InternetGetConnectedState()函数,检测到网络已经连接,输出结果如下图4.1所示: 图4.1 运行结果 在联网情况下,成功调用IE浏览器进程,输出结果如下图4.2所示: 图4.2 运行结果 调用InternetGetConnectedState()函数,检测到网络没有连接,输出结果如下图4.2所示: 图4.3 运行结果 在未联网
28、状态下,网页打不开,输出结果如下图4.2所示: 图4.4 运行结果4.2 实验结果分析这次的课程设计做的是简单的“进程的创建”,虽然简单,不如其他同学的难,但是在这期间也遇见了一些问题。首先就是老师为了让我们多了解一些知识,要求运用API函数,所以,在理解复杂的API函数过程中就出现了不能理解、不会自由灵活运用的情况,在用API函数编程的过程中,由于对API知识的不熟悉,期间出了许多错误,下面是在程序基本完成的时候出的错误。在编译的时候没有出错(如图5.1所示): 图5.1 编译时的输出 但是在组建的时候就会显示如下信息(如图5.2和5.3所示): 图5.2 组建时的输出图5.3 错误显示 经
29、过请教其他同学,在“工程 选项”中添加“wininet.lib”之后,就可以执行了。这个问题,我在网上查了,并没有得到明确的说法,所以,现在,我的理解就是,在连接过程中出了一些问题,加上的“wininet.lib”就相当于头文件之类的。 图5.4 进行的修改 这次课程设计让我对编程有了另外的一些看法。我的动手能力不强,没有自己编过什么程序,主要还是因为感觉上太难了,不敢动手做,而现在,我觉得,只要自己动手做了,慢慢的也就会了。结束语这次的课程设计,在赵静老师的指导与帮助下,通过查找资料,在实践中对各种概念和基本知识有了进一步的认识与掌握。我做的课题是“进程的创建”,主要用到了API函数和VC语
30、言。这次课程设计不仅帮我重新温习了VC,还让我对API函数有了一些认识和一定程度的理解。“千里之行,始于足下”,通过这次课程设计,我对这句话的含义又有了更深一层的理解。我做的是一个再简单不过的进程的创建,可是,其中的每一个函数模块,每一个函数,甚至每一个函数变量,都需要仔细、认真的考虑,只有把这些小事情都做好了,才能够把整个程序写出来。还有一点就是,我也着实认识到,将来走上社会,动手能力很关键。通过这次实践训练,提高了我综合运用知识的能力和水平。在此特别感谢赵静老师的指导与帮助。赵老师严谨细致、一丝不苟的工作作风值得我在将来的学习与工作中学习。参考文献【1】范文庆、周彬彬、安靖等,Windows API-函数、借口、编程实例,人民邮电出版社,2009年【2】谭浩强,C+程序设计,清华大学出版社,2004年【3】郁红英、李春强,计算机操作系统实验指导,清华大学出版社,2008年附录程序源代码如下:#include/头文件#include#includeusing namespace std;int main() int i; STARTUPINFO si; /进程启动时需要初始化的结构 PROCESS
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1