操作系统课程设计进程的创建文档格式.docx
《操作系统课程设计进程的创建文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计进程的创建文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
4.1实验结果14
4.2实验结果分析16
结束语18
参考文献19
附录20
第一章课程设计概述
1.1课程设计的目的与意义
1.1.1目的
本课程设计是为了配合操作系统课程的理论教学而设置的,目的是通过课程设计的综合训练,加强学生对操作系统概念的实际应用技能的训练,提高学生分析问题和解决问题的能力。
1.1.2意义
本次操作系统课程设计的主要任务是进行系统级的程序设计。
本课程设计是操作系统原理课程的延伸。
通过该课程设计,使学生更好地掌握操作系统各部分结构、实现机理和各种典型算法,加深对操作系统的设计和实现思路的理解,培养学生的系统设计和动手能力,学会分析和编写程序。
课程设计的实施将使学生在以下几个方面有所收获:
(1)加深对操作系统原理的理解,提高综合运用所学知识的能力;
(2)培养学生自主查阅参考资料的习惯,增强独立思考和解决问题的能力;
(3)通过课程设计,培养严谨的科学态度和协作精神。
1.2实验概述
1.2.1实验名称
进程的创建,获取进程的PID和操作系统的版本信息。
1.2.2实验目的
(1)通过编写程序实现进程的创建,使用进程和操作系统的版本信息,进程的终止,使学生进一步掌握进程调度的概念,加深对处理机分配的理解。
(2)了解Windows2000/XP中进程(线程)调度算法,掌握相应的与调度相关的API函数。
1.2.3实验要求
(1)Windows2000Professional,VisualC++;
(2)了解进程的概念,并理解进程的调度与访问;
(3)程序界面美观。
1.2.4实验内容
在WindowsXP,Windows2000等操作系统下,语言不限,最好为C或者C++,应用API函数,编写进程的创建,进程使用,进程终止操作。
第二章API函数简介
2.1API的定义
API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
2.2windowsAPI
WindowsAPI是一套用来控制Windows的各个部件的外观和行为的预先定义的Windows函数。
用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么。
这在某种程度上很像Windows的天然代码。
而其他的语言只是提供一种能自动而且更容易的访问API的方法。
当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体,VB获取这个调用并经过分析后生成一个特定事件。
API函数包含在Windows系统目录下的动态连接库文件中。
更易理解来说:
Windows系统除了协调应用程序的执行、内存的分配、系统资源的管理外,同时他也是一个很大的服务中心。
调用这个服务中心的各种服务(每一种服务就是一个函数)可以帮助应用程序达到开启视窗、描绘图形和使用周边设备等目的,由于这些函数服务的对象是应用程序,所以称之为ApplicationProgrammingInterface,简称API函数。
WIN32API也就是MicrosoftWindows32位平台的应用程序编程接口。
2.3开放API函数
基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用。
对外提供的API调用使得站点之间的内容关联性更强,同时这些开放的平台也为用户、开发者和中小网站带来了更大的价值。
开放是目前的发展趋势,越来越多的产品走向开放。
目前的网站不能靠限制用户离开来留住用户,开放的架构反而更增加了用户的粘性。
在Web2.0的浪潮到来之前,开放的API甚至源代码主要体现在桌面应用上,而现在越来越多的Web应用面向开发者开放了API。
具备分享、标准、去中心化、开放、模块化的Web2.0站点,在为使用者带来价值的同时,更希望通过开放的API来让站点提供的服务拥有更大的用户群和服务访问数量。
站点在推出基于开放API标准的产品和服务后,无需花费力气做大量的市场推广,只要提供的服务或应用出色易于使用,其他站点就会主动将开放API提供的服务整合到自己的应用之中。
同时,这种整合API带来的服务应用,也会激发更多富有创意的应用产生。
为了对外提供统一的API接口,需要对开发者开放资源调用API的站点提供开放统一的API接口环境,来帮助使用者访问站点的功能和资源。
当然,开放API的站点为第三方的开发者提供良好的社区支持也是很有意义的,这有助于吸引更多的技术人员参与到开放的开发平台中,并开发出更为有趣的第三方应用。
视频云技术提供商CC视频开放API接口,用户可以在自己的网站后台轻松完成视频的上传、视频播放控制操作,并可批量获取视频及平台信息。
第三章相关API函数
这个课程设计是基于API函数的,下面介绍在这个课程设计的过程中需要了解并理解的有关函数。
3.1CreateProcess()
1)定义:
WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。
2)函数原型:
BOOLCreateProcess
( LPCTSTRlpApplicationName,
LPTSTRlpCommandLine,
LPSECURITY_ATTRIBUTESlpProcessAttributes, LPSECURITY_ATTRIBUTESlpThreadAttributes,
BOOLbInheritHandles,
DWORDdwCreationFlags,
LPVOIDlpEnvironment,
LPCTSTRlpCurrentDirectory,
LPSTARTUPINFOlpStartupInfo, LPPROCESS_INFORMATIONlpProcessInformation
);
3)函数参数:
(1)lpApplicationName
指向一个NULL结尾的、用来指定可执行模块的字符串。
这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。
这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处lpCommandLine参数的最前面并由空格符与后面的字符分开。
(2)lpCommandLine
指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。
这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。
如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。
新运行的进程可以使用GetCommandLine函数获得整个命令行。
C语言程序可以使用argc和argv参数。
(3)lpProcessAttributes
指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。
如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
在WindowsNT中:
SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。
在Windows95中:
SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员被忽略。
(4)lpThreadAttributes
指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的指向线程的句柄可以被子进程继承。
如果lpThreadAttributes参数为空(NULL),那么句柄不能被继承。
在WindowsNT中,SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了主线程的安全描述符,如果参数为空,主线程使用默认的安全描述符。
(5)bInheritHandles
指示新进程是否从调用进程处继承了句柄。
如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。
被继承的句柄与原进程拥有完全相同的值和访问权限。
(6)dwCreationFlags
指定附加的、用来控制优先类和进程的创建的标志。
以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。
(7)lpEnvironment
指向一个新进程的环境块。
如果此参数为空,新进程使用调用进程的环境。
一个环境块存在于一个由以NULL结尾的字符串组成的块中,这个块也是以NULL结尾的。
每个字符串都是name=value的形式。
因为相等标志被当做分隔符,所以它不能被环境变量当做变量名。
(8)lpCurrentDirectory
指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。
这个字符串必须是一个包含驱动器名的绝对路径。
如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。
这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。
(9)lpStartupInfo
指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
(10)lpProcessInformation
指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。
4)返回值:
如果函数执行成功,返回非零值。
如果函数执行失败,返回零,可以使用GetLastError函数获得错误的附加信息。
3.2GetVersionEX()
1)函数功能:
GetVersionEx函数是获得操作系统版本号信息的方法,它取代了GetVersion函数的功能。
BOOLGetVersionEx
(LPOSVERSIONINFOlpVersionInformation;
//指向版本信息结构体的指针);
3)参数说明:
lpVersionInformation:
指向一个OSVERSIONINFO数据结构的指针,用于填充操作系统版本信息。
在调用GetVersionEx函数之前,先将OSVERSIONINFO数据结构的dwOSVersionInfoSize成员设置为为sizeof(OSVERSIONINFO)。
如果函数成功,返回值为非零。
如果函数失败,返回值为零,为了获得更多错误信息,可调用GetLastError函数。
如果给OSVERSIONINFO结构体的dwOSVersionInfoSize成员指定一个无效值,函数将失败。
3.3ReleaseMutex()
ReleaseMutex函数的功能是释放互斥对象。
一个线程释放了互斥对象后,如果其他进程在等待互斥对象置位,则等待的线程可以得到该互斥对象,等待函数返回,互斥对象被新的线程所拥有。
BOOLWIANPIReleaseMutex
(
HANDLEhMutex
);
3)返回值:
TRUE表示成功,FALSE表示失败。
4)参数说明:
hMutex:
HANDLE,制定一个互斥体的句柄。
3.4ExitProcess()
终止一个进程
2)VB声明:
DeclareSubExitProcessLib"
kernel32"
Alias"
ExitProcess"
(ByValuExitCodeAsLong)
3.5GetexitCodeProcess()
获取一个已中断进程的退出代码
BOOLWINAPIGetExitCodeProcess
(
__inHANDLEhProcess,
__outLPDWORDlpExitCode
);
3)VC声明:
BOOLGetExitCodeProcess
HANDLEhProcess,
LPDWORDlpExitCode
hProcessLong,想获取退出代码的一个进程的句柄 lpExitCodeLong,用于装载进程退出代码的一个长整数变量。
如进程尚未中止,则设为常数STILL_ACTIVE
5)返回值:
Long,非零表示成功,零表示失败。
设置GetLastError
3.6STARTUPINFO结构
STARTUPINFO结构,用于指定新进程的主窗口特性。
1)结构的定义:
typedefstruct_STARTUPINFO
{
DWORDcb;
DWORDdwX;
DWORDdwY;
DWORDdwXSize;
DWORDdwYSize;
DWORDdwXCountChars;
DWORDdwYCountChars;
DWORDdwFillAttribute;
DWORDdwFlags;
WORDwShowWindow;
WORDcbReserved2;
LPBYTElpReserved2;
HANDLEhStdInput;
HANDLEhStdOutput;
HANDLEhStdError;
}STARTUPINFO,*LPSTARTUPINFO;
2)函数参数说明:
(1)DWORDcb:
包含STARTUPINFO结构中的字节数.如果Microsoft将来扩展该结构,它可用作版本控制手段。
应用程序必须将cb初始化为sizeof(STARTUPINFO)
(2)PSTRlpReserved:
保留,必须初始化为NULL
(3)PSTRlpDesktop:
用于标识启动应用程序所在的桌面的名字。
如果该桌面存在,新进程便与指定的桌面相关联。
如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。
如果lpDesktop是NULL(这是最常见的情况),那么该进程将与当前桌面相关联。
(4)PSTRlpTitle:
用于设定控制台窗口的名称。
如果lpTitle是NULL,则可执行文件的名字将用作窗口名
(5)DWORDdwX:
用于设定应用程序窗口在屏幕上应该放置的位置的x和y坐标(以像素为单位)。
(6)DWORDdwY:
只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时,才使用这两个坐标。
若是创建控制台窗口的应用程序,这些成员用于指明控制台窗口的左上角
(7)WORDdwXSize和DWORDdwYSize:
用于设定应用程序窗口的宽度和长度(以像素为位)
(8)DWORDdwXCountChars:
用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位)
(9)DWORDdwYCountChars和DWORDdwFillAttribute:
//用于设定子应用程序的控制台窗口使用的文本和背景颜色
(10)WORDwShowWindow:
用于设定子应用程序初次调用的ShowWindow将SW_SHOWDEFAULT作为nCmdShow参数传递时,该应用程序的第一个重叠窗口应该如何出现。
(11)WORDcbReserved2:
保留。
必须被初始化为0
(12)PBYTElpReserved2:
必须被初始化为NULL
3.7PROCESS_INFORMATION结构
在创建进程时相关的数据结构之一,该结构返回有关新进程及其主线程的信息。
1)结构定义如下:
typedefstruct_PROCESS_INFORMATION
HANDLEhProcess;
HANDLEhThread;
DWORDdwProcessId;
DWORDdwThreadId;
}PROCESS_INFORMATION;
2)成员函数说明:
(1)hProcess:
返回新进程的句柄。
(2)hThread:
返回主线程的句柄。
(3)dwProcessId:
返回一个全局进程标识符。
该标识符用于标识一个进程。
从进程被创建到终止,该值始终有效。
(4)dwThreadId:
返回一个全局线程标识符。
该标识符用于标识一个线程。
从线程被创 建到终止,该值始终有效。
3.8GetStartupInfo
该函数返回进程在启动时被指定的STARTUPINFO结构。
2)函数原型
VOIDGetStartupInfo(LPSTARTUPINFOlpStartupInfo);
lpStartupInfo:
用来存放要获取的STARTUPINFO结构
4)返回值:
该函数没有返回值
3.9ShowWindow
该函数设置指定窗口的显示状态。
BOOLShowWindow(HWNDhWnd,intnCmdShow);
如果窗口当前可见,则返回值为非零。
如果窗口当前被隐藏,则返回值为零。
3.10InternetGetConnectedState
用以返回本地系统的网络连接状态。
BOOLInternetGetConnectedState
( __outLPDWORDlpdwFlags,
__inDWORDdwReserved,);
3)函数参数说明:
lpdwFlags:
指向一个变量,该变量接收连接描述内容。
该参数在函数返回FLASE时仍可以返回一个有效的标记。
4)返回值
当存在一个modem或一个LAN连接时,返回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运行结果
在未联网状态下,网页打不开,输出结果如下图4.2所示:
图4.4运行结果
4.2实验结果分析
这次的课程设计做的是简单的“进程的创建”,虽然简单,不如其他同学的难,但是在这期间也遇见了一些问题。
首先就是老师为了让我们多了解一些知识,要求运用API函数,所以,在理解复杂的API函数过程中就出现了不能理解、不会自由灵活运用的情况,在用API函数编程的过程中,由于对API知识的不熟悉,期间出了许多错误,下面是在程序基本完成的时候出的错误。
在编译的时候没有出错(如图5.1所示):
图5.1编译时的输出
但是在组建的时候就会显示如下信息(如图5.2和5.3所示):
图5.2组建时的输出
图5.3错误显示
经过请教其他同学,在“工程选项”中添加“wininet.lib”之后,就可以执行了。
这个问题,我在网上查了,并没有得到明确的说法,所以,现在,我的理解就是,在连接过程中出了一些问题,加上的“wininet.lib”就相当于头文件之类的。
图5.4进行的修改
这次课程设计让我对编程有了另外的一些看法。
我的动手能力不强,没有自己编过什么程序,主要还是因为感觉上太难了,不敢动手做,而现在,我觉得,只要自己动手做了,慢慢的也就会了。
结束语
这次的课程设计,在赵静老师的指导与帮助下,通过查找资料,在实践中对各种概念和基本知识有了进一步的认识与掌握。
我做的课题是“进程的创建”,主要用到了API函数和VC语言。
这次课程设计不仅帮我重新温习了VC,还让我对API函数有了一些认识和一定程度的理解。
“千里之行,始于足下”,通过这次课程设计,我对这句话的含义又有了更深一层的理解。
我做的是一个再简单不过的进程的创建,可是,其中的每一个函数模块,每一个函数,甚至每一个函数变量,都需要仔细、认真的考虑,只有把这些小事情都做好了,才能够把整个程序写出来。
还有一点就是,我也着实认识到,将来走上社会,动手能力很关键。
通过这次实践训练,提高了我综合运用知识的能力和水平。
在此特别感谢赵静老师的指导与帮助。
赵老师严谨细致、一丝不苟的工作作风值得我在将来的学习与工作中学习。
参考文献
【1】范文庆、周彬彬、安靖等,WindowsAPI-函数、借口、编程实例,人民邮电出版社,2009年
【2】谭浩强,C++程序设计,清华大学出版社,2004年
【3】郁红英、李春强,计算机操作系统实验指导,清华大学出版社,2008年
附录
程序源代码如下:
#include<
windows.h>
//头文件
Wininet.h>
iostream>
usingnamespacestd;
intmain()
inti;
STARTUPINFOsi;
//进程启动时需要初始化的结构
PROCESS