进程及其布局
2019-07-08 本文已影响2人
307656af5a04
一、Windows程序设计背景知识
1、进程创建和工程意义:进程是一种CPU资源调度得软件手段
2、CPU的保护模式与进程概念释疑
3、句柄与内核对象
二、进程创建
三、进程控制
进程及其布局
一、Windows多任务的实现
1、多进程(多任务)操作系统
2、进程是正在运行的应用程序的实例
二、进程Process和线程thread
1、进程是正在运行的应用程序的实例,拥有自己的代码、数据和其他系统资源,包含一个或多个线程。
2、线程是进程内执行代码的独立实体。占有CPU时间片执行指令的是线程。
3、进程至少包含一个主线程,主线程会创建其他线程。所有线程共享所属进程的内存空间和资源,且仅能访问属于它的进程内存。
CreateProcess函数详解
一、启动Windows自带的笔记本程序(核心代码)
STARTUPINFO si;
memset(&si, 0, sizeof(si));
PROCESS_INFORMATION pi;
char *szCommandLine = "notepad";
::CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
二、STARTUPINFO结构
在创建新进程时会为新进程指定一个STARTUPINFO类型的变量。这些信息将影响新的进程中主线程的主窗口的显示。
一个进程可以通过GetStartupInfo函数来取得父进程创建自己时使用的STARTUPINFO结构,如下所示:
memset(&si, 0, sizeof(STARTUPINFO)); // 初始化si全部成员
三、PROCESS_INFORMATION结构
进程与线程的句柄和ID,时CreateProcess的out参数
typedef struct _PROCESS_INFOMATION
{
HANDLE hProcess; // 新建进程内核句柄
HANDLE hThread; // 主线程内核句柄
DWORD dwProcessId; // 新建进程Id
DWORD dwThreadId; // 主线程Id
}PROCESS_INFOMATION;
四、创建进程的例子
#include <Windows.h>
#include <iostream>
int main()
{
char *szCommandLine = "notepad";
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO)); // 初始化si全部成员
si.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成员有效
// 此成员设置为TRUE的话,则显示新建进程的窗口,为FALSE的话则不显示
si.wShowWindow = TRUE;
PROCESS_INFORMATION pi;
BOOL bRet = ::CreateProcess(
NULL, // 不在此指定可执行文件的文件名
szCommandLine, // 命令行参数
NULL, // 默认进程安全性
NULL, // 默认线程安全性
FALSE, // 指定当前进程内的句柄不可被子进程继承
CREATE_NEW_CONSOLE, // 为新进程创建一个新的控制台窗口
NULL, // 使用本进程的环境变量
NULL, // 使用本进程的驱动器和目录
&si,
&pi);
if (bRet)
{
printf("新进程的进程Id号:%d\n",pi.dwProcessId);
printf("新进程的主线程Id号:%d\n",pi.dwThreadId);
}
system("pause");
return 0;
}