刚上操作系统实验课,老师给了几个程序分析,看不懂.请问应看什么方面的书了解以下程序的原理.都是正确的程序,大家能不能帮忙研究研究?
3_3
// proclist项目
# include <windows.h>
# include <tlhelp32.h>
# include <iostream.h>// 当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法
DWORD GetKernelModePercentage(const FILETIME& ftKernel,
const FILETIME& ftUser)
{
// 将FILETIME结构转化为64位整数
ULONGLONG qwKernel=(((ULONGLONG)ftKernel.dwHighDateTime)
<<32)+ftKernel.dwLowDateTime;
ULONGLONG qwUser=(((ULONGLONG)ftUser.dwHighDateTime)
<<32)+ftUser.dwLowDateTime; // 将消耗时间相加,然后计算消耗在内核模式下的时间百分比
ULONGLONG qwTotal=qwKernel+qwUser;
DWORD dwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal);
return(dwPct);
}// 以下是将当前运行过程名和消耗在内核模式下的时间百分数都显示出来的应用程序
void main()
{
// 对当前系统中运行的过程拍取“快照”
HANDLE hSnapshot=::CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, // 提取当前过程
0); // 如果是当前过程,就将其忽略 // 初始化过程入口
PROCESSENTRY32 pe;
::ZeroMemory(&pe,sizeof(pe));
pe.dwSize=sizeof(pe);
BOOL bMore=::Process32First(hSnapshot,&pe);
while(bMore)
{
// 打开用于读取的过程
HANDLE hProcess=::OpenProcess(
PROCESS_QUERY_INFORMATION, // 指明要得到信息
FALSE, // 不必继承这一句柄
pe.th32ProcessID); // 要打开的进程
if (hProcess!=NULL)
{
// 找出进程的时间
FILETIME ftCreation,ftKernelMode,ftUserMode,ftExit;
::GetProcessTimes(
hProcess, // 所感兴趣的进程
&ftCreation, // 进程的启动时间
&ftExit, // 结束时间 (如果有的话)
&ftKernelMode, // 在内核模式下消耗的时间
&ftUserMode); // 在用户模式下消耗的时间 // 计算内核模式消耗的时间百分比
DWORD dwPctKernel=::GetKernelModePercentage(
ftKernelMode, // 在内核模式上消耗的时间
ftUserMode); // 在用户模式下消耗的时间 // 向用户显示进程的某些信息
cout<< "process ID: " << pe.th32ProcessID
<< ",EXE file:" << pe.szExeFile
<< ",% in Kernel mode: " << dwPctKernel << endl; // 消除句柄
::CloseHandle(hProcess);
} // 转向下一个进程
bMore=::Process32Next(hSnapshot,&pe);
}
}3_4
// proccreate项目
#include <windows.h>
#include <iostream>
#include <stdio.h>// 创建传递过来的进程的克隆过程并赋于其ID值
void StartClone(int nCloneID)
{
// 提取用于当前可执行文件的文件名
TCHAR szFilename[MAX_PATH] ;
:: GetModuleFileName(NULL, szFilename, MAX_PATH) ; // 格式化用于子进程的命令行并通知其EXE文件名和克隆ID
TCHAR szCmdLine[MAX_PATH];
:: sprintf(szCmdLine,"\"%s\" d%",szFilename,nCloneID); // 用于子进程的STARTUPINFO结构
STARTUPINFO si;
:: ZeroMemory(reinterpret_cast <void*> (&si) , sizeof(si) ) ;
si.cb = sizeof(si) ; // 必须是本结构的大小 // 返回的用于子进程的进程信息
PROCESS_INFORMATION pi; // 利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质
BOOL bCreateOK=::CreateProcess(
szFilename, // 产生这个EXE的应用程序的名称
szCmdLine, // 告诉其行为像一个子进程的标志
NULL, // 缺省的进程安全性
NULL, // 缺省的线程安全性
FALSE, // 不继承句柄
CREATE_NEW_CONSOLE, // 使用新的控制台
NULL, // 新的环境
NULL, // 当前目录
&si, // 启动信息
&pi) ; // 返回的进程信息 // 对子进程释放引用
if (bCreateOK)
{
:: CloseHandle(pi.hProcess) ;
:: CloseHandle(pi.hThread) ;
}
}int main(int argc, char* argv[] )
{
// 确定进程在列表中的位置
int nClone(0) ;
if (argc > 1)
{
// 从第二个参数中提取克隆ID
:: sscanf(argv[1] , "%d" , &nClone) ;
} // 显示进程位置
std :: cout << "Process ID:" << :: GetCurrentProcessId()
<< ", Clone ID:" << nClone
<< std :: endl; // 检查是否有创建子进程的需要
const int c_nCloneMax=25;
if (nClone < c_nCloneMax)
{
// 发送新进程的命令行和克隆号
StartClone(++nClone) ;
} // 在终止之前暂停一下 (l/2秒)
:: Sleep(500) ; return 0;
}
3_5
// procterm项目
# include <windows.h>
# include <iostream>
# include <stdio.h>
static LPCTSTR g_szMutexName = "w2kdg.ProcTerm.mutex.Suicide" ;// 创建当前进程的克隆进程的简单方法
void StartClone()
{
// 提取当前可执行文件的文件名
TCHAR szFilename[MAX_PATH] ;
:: GetModuleFileName(NULL, szFilename, MAX_PATH) ; // 格式化用于子进程的命令行,指明它是一个EXE文件和子进程
TCHAR szCmdLine[MAX_PATH] ;
:: sprintf(szCmdLine, "\"%s\"child" , szFilename) ; // 子进程的启动信息结构
STARTUPINFO si;
:: ZeroMemory(reinterpret_cast <void*>(&si),sizeof(si)) ;
si.cb = sizeof(si) ; // 应当是此结构的大小 // 返回的用于子进程的进程信息
PROCESS_INFORMATION pi; // 用同样的可执行文件名和命令行创建进程,并指明它是一个子进程
BOOL bCreateOK=::CreateProcess(
szFilename, // 产生的应用程序的名称 (本EXE文件)
szCmdLine, // 告诉我们这是一个子进程的标志
NULL, // 用于进程的缺省的安全性
NULL, // 用于线程的缺省安全性
FALSE, // 不继承句柄
CREATE_NEW_CONSOLE, //创建新窗口
NULL, // 新环境
NULL, // 当前目录
&si, // 启动信息结构
&pi ) ; // 返回的进程信息 // 释放指向子进程的引用
if (bCreateOK)
{
:: CloseHandle(pi.hProcess) ;
:: CloseHandle(pi.hThread) ;
}
}void Parent()
{
// 创建“自杀”互斥程序体
HANDLE hMutexSuicide=:: CreateMutex(
NULL, // 缺省的安全性
TRUE, // 最初拥有的
g_szMutexName) ; // 为其命名
if (hMutexSuicide != NULL)
{
// 创建子进程
std :: cout << "Creating the child process." << std :: endl;
:: StartClone() ; // 暂停
:: Sleep(5000) ; // 指令子进程“杀”掉自身
std :: cout << "Telling the child process to quit. "<< std :: endl;
:: ReleaseMutex(hMutexSuicide) ; // 消除句柄
:: CloseHandle(hMutexSuicide) ;
}
}void Child()
{
// 打开“自杀”互斥体
HANDLE hMutexSuicide = :: OpenMutex(
SYNCHRONIZE, // 打开用于同步
FALSE, // 不需要向下传递
g_szMutexName) ; // 名称
if (hMutexSuicide != NULL)
{
// 报告我们正在等待指令
std :: cout <<"Child waiting for suicide instructions. " << std :: endl;
:: WaitForSingleObject(hMutexSuicide, INFINITE) ; // 准备好终止,清除句柄
std :: cout << "Child quiting." << std :: endl;
:: CloseHandle(hMutexSuicide) ;
}
}int main(int argc, char* argv[] )
{
// 决定其行为是父进程还是子进程
if (argc>1 && :: strcmp(argv[1] , "child" )== 0)
{
Child() ;
}
else
{
Parent() ;
}
return 0;
}
3_3
// proclist项目
# include <windows.h>
# include <tlhelp32.h>
# include <iostream.h>// 当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法
DWORD GetKernelModePercentage(const FILETIME& ftKernel,
const FILETIME& ftUser)
{
// 将FILETIME结构转化为64位整数
ULONGLONG qwKernel=(((ULONGLONG)ftKernel.dwHighDateTime)
<<32)+ftKernel.dwLowDateTime;
ULONGLONG qwUser=(((ULONGLONG)ftUser.dwHighDateTime)
<<32)+ftUser.dwLowDateTime; // 将消耗时间相加,然后计算消耗在内核模式下的时间百分比
ULONGLONG qwTotal=qwKernel+qwUser;
DWORD dwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal);
return(dwPct);
}// 以下是将当前运行过程名和消耗在内核模式下的时间百分数都显示出来的应用程序
void main()
{
// 对当前系统中运行的过程拍取“快照”
HANDLE hSnapshot=::CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, // 提取当前过程
0); // 如果是当前过程,就将其忽略 // 初始化过程入口
PROCESSENTRY32 pe;
::ZeroMemory(&pe,sizeof(pe));
pe.dwSize=sizeof(pe);
BOOL bMore=::Process32First(hSnapshot,&pe);
while(bMore)
{
// 打开用于读取的过程
HANDLE hProcess=::OpenProcess(
PROCESS_QUERY_INFORMATION, // 指明要得到信息
FALSE, // 不必继承这一句柄
pe.th32ProcessID); // 要打开的进程
if (hProcess!=NULL)
{
// 找出进程的时间
FILETIME ftCreation,ftKernelMode,ftUserMode,ftExit;
::GetProcessTimes(
hProcess, // 所感兴趣的进程
&ftCreation, // 进程的启动时间
&ftExit, // 结束时间 (如果有的话)
&ftKernelMode, // 在内核模式下消耗的时间
&ftUserMode); // 在用户模式下消耗的时间 // 计算内核模式消耗的时间百分比
DWORD dwPctKernel=::GetKernelModePercentage(
ftKernelMode, // 在内核模式上消耗的时间
ftUserMode); // 在用户模式下消耗的时间 // 向用户显示进程的某些信息
cout<< "process ID: " << pe.th32ProcessID
<< ",EXE file:" << pe.szExeFile
<< ",% in Kernel mode: " << dwPctKernel << endl; // 消除句柄
::CloseHandle(hProcess);
} // 转向下一个进程
bMore=::Process32Next(hSnapshot,&pe);
}
}3_4
// proccreate项目
#include <windows.h>
#include <iostream>
#include <stdio.h>// 创建传递过来的进程的克隆过程并赋于其ID值
void StartClone(int nCloneID)
{
// 提取用于当前可执行文件的文件名
TCHAR szFilename[MAX_PATH] ;
:: GetModuleFileName(NULL, szFilename, MAX_PATH) ; // 格式化用于子进程的命令行并通知其EXE文件名和克隆ID
TCHAR szCmdLine[MAX_PATH];
:: sprintf(szCmdLine,"\"%s\" d%",szFilename,nCloneID); // 用于子进程的STARTUPINFO结构
STARTUPINFO si;
:: ZeroMemory(reinterpret_cast <void*> (&si) , sizeof(si) ) ;
si.cb = sizeof(si) ; // 必须是本结构的大小 // 返回的用于子进程的进程信息
PROCESS_INFORMATION pi; // 利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质
BOOL bCreateOK=::CreateProcess(
szFilename, // 产生这个EXE的应用程序的名称
szCmdLine, // 告诉其行为像一个子进程的标志
NULL, // 缺省的进程安全性
NULL, // 缺省的线程安全性
FALSE, // 不继承句柄
CREATE_NEW_CONSOLE, // 使用新的控制台
NULL, // 新的环境
NULL, // 当前目录
&si, // 启动信息
&pi) ; // 返回的进程信息 // 对子进程释放引用
if (bCreateOK)
{
:: CloseHandle(pi.hProcess) ;
:: CloseHandle(pi.hThread) ;
}
}int main(int argc, char* argv[] )
{
// 确定进程在列表中的位置
int nClone(0) ;
if (argc > 1)
{
// 从第二个参数中提取克隆ID
:: sscanf(argv[1] , "%d" , &nClone) ;
} // 显示进程位置
std :: cout << "Process ID:" << :: GetCurrentProcessId()
<< ", Clone ID:" << nClone
<< std :: endl; // 检查是否有创建子进程的需要
const int c_nCloneMax=25;
if (nClone < c_nCloneMax)
{
// 发送新进程的命令行和克隆号
StartClone(++nClone) ;
} // 在终止之前暂停一下 (l/2秒)
:: Sleep(500) ; return 0;
}
3_5
// procterm项目
# include <windows.h>
# include <iostream>
# include <stdio.h>
static LPCTSTR g_szMutexName = "w2kdg.ProcTerm.mutex.Suicide" ;// 创建当前进程的克隆进程的简单方法
void StartClone()
{
// 提取当前可执行文件的文件名
TCHAR szFilename[MAX_PATH] ;
:: GetModuleFileName(NULL, szFilename, MAX_PATH) ; // 格式化用于子进程的命令行,指明它是一个EXE文件和子进程
TCHAR szCmdLine[MAX_PATH] ;
:: sprintf(szCmdLine, "\"%s\"child" , szFilename) ; // 子进程的启动信息结构
STARTUPINFO si;
:: ZeroMemory(reinterpret_cast <void*>(&si),sizeof(si)) ;
si.cb = sizeof(si) ; // 应当是此结构的大小 // 返回的用于子进程的进程信息
PROCESS_INFORMATION pi; // 用同样的可执行文件名和命令行创建进程,并指明它是一个子进程
BOOL bCreateOK=::CreateProcess(
szFilename, // 产生的应用程序的名称 (本EXE文件)
szCmdLine, // 告诉我们这是一个子进程的标志
NULL, // 用于进程的缺省的安全性
NULL, // 用于线程的缺省安全性
FALSE, // 不继承句柄
CREATE_NEW_CONSOLE, //创建新窗口
NULL, // 新环境
NULL, // 当前目录
&si, // 启动信息结构
&pi ) ; // 返回的进程信息 // 释放指向子进程的引用
if (bCreateOK)
{
:: CloseHandle(pi.hProcess) ;
:: CloseHandle(pi.hThread) ;
}
}void Parent()
{
// 创建“自杀”互斥程序体
HANDLE hMutexSuicide=:: CreateMutex(
NULL, // 缺省的安全性
TRUE, // 最初拥有的
g_szMutexName) ; // 为其命名
if (hMutexSuicide != NULL)
{
// 创建子进程
std :: cout << "Creating the child process." << std :: endl;
:: StartClone() ; // 暂停
:: Sleep(5000) ; // 指令子进程“杀”掉自身
std :: cout << "Telling the child process to quit. "<< std :: endl;
:: ReleaseMutex(hMutexSuicide) ; // 消除句柄
:: CloseHandle(hMutexSuicide) ;
}
}void Child()
{
// 打开“自杀”互斥体
HANDLE hMutexSuicide = :: OpenMutex(
SYNCHRONIZE, // 打开用于同步
FALSE, // 不需要向下传递
g_szMutexName) ; // 名称
if (hMutexSuicide != NULL)
{
// 报告我们正在等待指令
std :: cout <<"Child waiting for suicide instructions. " << std :: endl;
:: WaitForSingleObject(hMutexSuicide, INFINITE) ; // 准备好终止,清除句柄
std :: cout << "Child quiting." << std :: endl;
:: CloseHandle(hMutexSuicide) ;
}
}int main(int argc, char* argv[] )
{
// 决定其行为是父进程还是子进程
if (argc>1 && :: strcmp(argv[1] , "child" )== 0)
{
Child() ;
}
else
{
Parent() ;
}
return 0;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货