ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

进程

2021-12-29 18:05:34  阅读:156  来源: 互联网

标签:句柄 si 线程 进程 pi ID


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

每个程序都有自己独立的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这个编号去访问一个进程的时候,它已经结束了,而且系统将这个编号赋给了另外一个进程或者线程.

标签:句柄,si,线程,进程,pi,ID
来源: https://www.cnblogs.com/lnterpreter/p/15666552.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有