【操作系统】实验二 进程的描述与控制
Windows所创建的每个进程都是以调用CreateProcess() API函数开始和以调用ExitProcess() 或TerminateProcess() API函数终止。
创建进程
程序的问题
:: sprintf(szCmdLine,"\"%s\" d%",szFilename,nCloneID);
应当改为:
:: sprintf(szCmdLine,"\"%s\" %d",szFilename,nCloneID);
实验结果
输入2-1 23
程序分析
1.学会了如何使用附加进程进行断点调试。
2.如图3设置断点
3.子进程接受传递的父进程参数为
4.这些参数所含的意义和来源
TCHAR szCmdLine[MAX_PATH];
::sprintf(szCmdLine, "\"%s\" %d", szFilename, nCloneID);
BOOL bCreateOK = ::CreateProcess(
szFilename, // 产生这个EXE的应用程序的名称
szCmdLine, // 告诉其行为像一个子进程的标志
NULL, // 缺省的进程安全性
NULL, // 缺省的线程安全性
FALSE, // 不继承句柄
CREATE_NEW_CONSOLE, // 使用新的控制台
NULL, // 新的环境
NULL, // 当前目录
&si, // 启动信息
&pi); // 返回的进程信息
argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数。 子程序接受了父进程的szFilename, nCloneID,通过前面的断点可以看出来。我们再尝试一次: nCloneID为24 子进程接收的nCloneID也为24
根据这行代码:
if (nClone < c_nCloneMax)//c_nCloneMax=25
这便是为什么打开了最多26个窗口的原因。(0-25)
正在运行的进程
终止进程
代码错误
:: sprintf(szCmdLine, "\"%s\"child" , szFilename) ;
在child前应当加上空格
:: sprintf(szCmdLine, "\"%s\" child" , szFilename) ;
2-3实验结果
实验总结
2-1
见前面分析
2-2
[ Windows 8.1之后的版本可能会更改或无法使用GetVersionEx。]
随着Windows 8.1的发布,GetVersionEx API 的行为已经改变了它将为操作系统版本返回的值。GetVersionEx函数返回的值现在取决于应用程序的显示方式。
未在Windows 8.1或Windows 10中显示的应用程序将返回Windows 8操作系统版本值(6.2)。一旦应用程序显示给定的操作系统版本,GetVersionEx将始终返回应用程序在将来版本中显示的版本。要显示Windows 8.1或Windows 10 的应用程序。。
在新的系统中使用了Version Helper functions来代替。
Function | Description |
---|---|
IsWindows10OrGreater | Indicates if the current OS version matches, or is greater than, the Windows 10 version.For Windows 10, IsWindows10OrGreater returns false unless the application contains a manifest that includes a compatibility section that contains the GUID that designates Windows 10. |
IsWindowsServer | Indicates if the current OS is a Windows Server release. Applications that need to distinguish between server and client versions of Windows should call this function. |
2-3
ReleaseMutex如果调用线程不拥有互斥对象功能失效。
线程通过在bInitialOwner参数设置为TRUE的情况下创建互斥锁,或者通过在调用其中一个等待函数时指定其句柄来获取互斥锁的所有权。当线程不再需要拥有互斥对象时,它会调用ReleaseMutex函数,以便另一个线程可以获得所有权。
线程可以指定它在调用其中一个等待函数时已拥有的互斥锁,而不会阻止其执行。这可以防止线程在等待它已拥有的互斥锁时自行死锁。但是,要释放其所有权,线程必须在每次获得所有权时(通过CreateMutex或等待函数)调用 ReleaseMutex一次。