1.windows进程
进程是一个容器,包含程序执行需要的代码、数据、资源等信息。windows是多任务操作系统,可以同时执行多个进程。
windows进程特点:
(1)每个进程都有自己的ID
(2)每个进程都有自己的地址空间,进程之间无法访问对方的地址空间
(3)每个进程都有自己的安全属性
(4)每个进程至少包含一个线程
2.进程环境信息(进程上下文)
(1)获取和释放环境信息
获取
LPVOID GetEnvironmentStrings( VOID );
释放
BOOL FreeEnvironmentStrings( LPTSTR lpszEnvironmentBlock );
(2)获取和设置环境变量
GetEnvironmentVariable
SetEnvironmentVariable
3.进程的信息
(1)进程ID
GetCurrentProcessId
(2)进程句柄
GetCurrentProcess
返回进程的伪句柄(-1),该句柄访问该进程的所有操作
4.进程的使用
(1)创建进程
WinExec - 早起16位
ShellExecute - shell操作
CreateProcess - 目前最多使用
BOOL CreateProcess( LPCTSTR lpApplicationName, //引用程序名称(可执行文件的全路径)
LPTSTR lpCommandLine, //命令行参数(WinMain/main等函数能接收到)
SECURITY_ATTRIBUTES lpProcessAttributes, //进程安全属性
SECURITY_ATTRIBUTES lpThreadAttributes, //线程安全属性
BOOL bInheritHandles, //当前进程的子进程是否能继承(使用)当前进程句柄
DWORD dwCreationFlags, //创建方式
LPVOID lpEnvironment, //环境信息
LPCTSTR lpCurrentDirectory, //当前(工作)目录
LPSTARTUPINFO lpStartupInfo, //起始信息
LPPROCESS_INFOMATION lpProcessInformation); //返回进程和线程句柄
(2)结束进程
//结束本进程
VOID ExitProcess( UINT uExitCode ); //退出码
//结束某个进程
BOOL TerminateProcess( HANDLE hProcess, //进程句柄
UINT uExitCode); //退出码
(3)通过进程ID获取进程句柄
HANDLE OpenProcess( DWORD dwDesiredAccess, //访问权限
BOOL hInheritHandle, //继承标识
DWORD dwProcessId); //进程ID
返回进程句柄
(4)关闭进程句柄
CloseHandle(不能杀死进程,只是把进程句柄置为-1)
(5)进程间等候
//等候可等候句柄(只有无信号和有信号两种状态的句柄)有信号
DWORD WaitForSingleObject( HANDLE hHandle, //句柄
DWORD dwMilliseconds); //等候时间,毫秒为单位,INFINITE
阻塞函数,等候句柄的信号,只有句柄有信号或超出等候时间,才会结束。
目前为止只有进程句柄是可等候句柄,那么进程句柄什么时候是有信号,什么时候是不信号状态呢?
进程执行中,是无信号状态;进程结束,是由信号状态。
相关代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include "stdafx.h" #include "windows.h" #include "stdio.h" DWORD g_dwProcId = 0; void Env() { char *pszEnv = (char*)GetEnvironmentStrings(); char *pszText = pszEnv; while (pszText[0]) { printf("%s ", pszText); pszText = pszText + strlen(pszText)+1; } FreeEnvironmentStrings(pszEnv); } void Variable() { SetEnvironmentVariable("XXXX", "YYYY"); char szVar[256] = { 0 }; GetEnvironmentVariable("XXXX", szVar, 256); printf("%s ", szVar); } void ProcInfo() { DWORD nID = GetCurrentProcessId(); HANDLE hProc = GetCurrentProcess(); printf("ID=%d, hProc=%d ", nID, hProc); } void Proc() { STARTUPINFO si = { 0 }; PROCESS_INFORMATION pi = { 0 }; //创建计算器进程 CreateProcess("c:/windows/system32/calc.exe", NULL, NULL, NULL, FALSE, 0, "", NULL, &si, &pi); printf("ID=%d, 句柄=%d ", pi.dwProcessId, pi.hProcess); g_dwProcId = pi.dwProcessId; //等待计算器进程结束 WaitForSingleObject(pi.hProcess, INFINITE); printf("wait over. "); } void Kill() { HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_dwProcId); TerminateProcess(hProc, 123); } int _tmain(int argc, _TCHAR* argv[]) { //Env(); //Variable(); //ProcInfo(); Proc(); //Kill(); return 0; }