一、 进程
1.1简单的说
双击一个EXE图标时,系统就会产生一个相应的进程,分配相应的资源,并执行相应的代码。1.2标准一些的说法
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。1.3进程的定义
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。二、 进程相关函数
2.1进程的诞生
假设EXE文件名为app.exe函数:CreateProcess
2.1.1系统创建步骤
1、系统Shell调用CreateProcess 创建名为app.exe的进程
2、系统产生一个“进程核心对象”,计数值为1
3、系统为此进程建立一个4GB的地址空间
4、系统将代码及相关数据加载映射到上述地址空间(如app.exe的程序代码,数据资源,dll动态链接库等)
5、系统为此进程创建一个线程,这个线程称为主线程(primary thread),线程才是CPU时间分配对象。
进程可以想成是一个家庭,线程是家里的成员,主线程就是一家之长!,一个进程最少有一个线程。
6、系统调用C runtime 函数库的Startup code
7、Startup code 调用App程序的WinMain入口函数
8、App程序开始运行
2.2进程的死亡
2.2.1系统正常结束
9、使用者关闭app主窗口,使WinMain消息循环结束,于是winMain结束。
10、回到Startup code
11、回到系统,系统调用 ExitProcess结束进程
函数:TerminateProcess三、相关代码测试
PROCESS_INFORMATION pi;//注意这应该放到.h文件中
void C进程Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
STARTUPINFO si = { sizeof(si) };
TCHAR vs[256] = L"notepad.exe d:\\1.txt";//命令行参数
CreateProcess(NULL, vs, NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
}
void C进程Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//退出进程 参数说明:
TerminateProcess(pi.hProcess, //1、hProcess:要终止(杀死)进程的句柄,需要有PROCESS_TERMINATE权限。
1222); //2、uExitCode:设置进程的退出值。可通过GetExitCodeProcess函数得到一个进程的退出值。
}
若报错,可改为“使用 Unicode 字符集”。
或者将CreateProcess改为CreateProcessA,将STARTUPINFO改为STARTUPINFOA。此时可将vs的值直接复制到CreateProcessA中。
CreateProcessA(NULL, "notepad.exe d:\\1.txt", NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);