进程

一、进程内存空间的地址划分

进程

每个程序都有自己独立的4G虚拟内存,只有当你真正申请的时候,才会把内存分给你

二、进程的创建

1、每个进程都是由别的进程创建的,explorer.exe,explorer调用了一个函数CreatProcess()

2、进程的创建

  • 映射EXE文件

进程

  • 创建内核对象EPROCESS

进程

  • 映射系统DLL(ntdll.dll)

进程

  • 创建线程内核对象ETHREAD

进程

  • 系统启动线程
    • 映射DLL

进程

  • 线程开始执行

三、进程

1、命令行参数

#include "stdafx.h"


//**********************************************************************
int main(int argc, char* argv[])
{
	printf("%s - %s - %s",argv[0],argv[1],argv[2]);
	getchar();
	return 0;
}

进程

2、创建一个子进程打开IE浏览器

#include "stdafx.h"
#include "windows.h"

//打开子进程函数
BOOL CreateProcess(PTCHAR route,PTCHAR szCommandLine)
{
	//定义两个结构体
	STARTUPINFO si;
	PROCESS_INFORMATION pi ;

	//初始化结构体
	ZeroMemory(&pi,sizeof(pi));
	ZeroMemory(&si,sizeof(si));
	
	//si结构体的cb 必须要赋值
	si.cb = sizeof(si);

	//创建子程序  返回成功与失败
	if(!CreateProcess(
		route,				//打开程序的路径
		szCommandLine,		        //命令行参数
		NULL,                           //进程相关的属性(是否可以被继承)
		NULL,                           //线程程相关的属性(是否可以被继承)
		FALSE,                          //创建子进程,允不允许子进程继承父进程的句柄表
		0,                              //填NULL子进程共享父进程的控制台
		NULL,                           
		NULL,                           //创建的子进程获取的当前目录是父进程的当前目录,如果子进程想得到自己真实的当前目录此处不能选NULL
		&si,				//创建子进程的详细信息
		&pi)				//存储的是进程ID,线程ID,进程句柄,线程句柄
		)
	{//打印错误信息
		printf("Error:%d\n",GetLastError());
		return FALSE;	
	}
	
        //打印线程进程id,线程id,进程句柄,线程句柄
	printf("%d  %d  %d  %d\n",pi.dwProcessId,pi.dwThreadId,pi.hProcess,pi.hThread);
	//释放句柄
	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);
	return TRUE;
}

int main(int argc, char* argv[])
{
	
	TCHAR route[] = TEXT("C://Program Files//Internet Explorer//IEXPLORE.exe");
        //命令行参数,记得加个空格以防不认识参数
	TCHAR szCmdLine[] = TEXT(" http://www.baidu.com/");
	
	CreateProcess(route,szCmdLine);	//程序路径,命令行参数
	getchar();
	return 0;
}

四、句柄和ID

1、都是系统分配的一个编号,句柄是客户程序使用 ID主要是系统调度时使用.

2、调用CloseHandle关闭进程或者线程句柄的时候,只是让内核计数器减少一个,并不是终止进程或者线程. 进程或线程将继续运行,直到它自己终止运行。

3、进程ID与线程ID 是不可能相同。但不要通过进程或者线程的ID来操作进程或者线程,因为,这个编号是会重复使用的,也就是说,当你通过ID=100这个编号去访问一个进程的时候,它已经结束了,而且系统将这个编号赋给了另外一个进程或者线程.

上一篇:MaxCompute SQL使用小技巧之时间日期处理


下一篇:网络基础CCNP|OSPF(6)