转自:http://blog.csdn.net/bxhj3014/article/details/2082255

一、进程的概念
       进程是是一个正在运行的程序的实例(飘~~~),是系统分配资源的单位(线程是执行的单位),包括内存,打开的文件、处理机、外设等,进程由两部分组成:
      1、进程的内核对象:即我们通常所讲的PCB(进程控制块),该结构只能由该内核访问,他是操作系统用来管理进程的一个数据结构,操作系统通过该数据结构来感知和管理进程;它的成员负责维护进程的各种信息,包括进程的状态(创建、就绪、运行、睡眠、挂起、僵死等)、消息队列等;同时也是系统用来存放关于进程的统计信息的地方。
      注:具体结构参照Linux的task_struct数据结构。
      2、进程的地址空间:包含所有可执行模块或DLL模块的代码和数据,以及动态内存分配的空间,如线程堆栈和堆分配的空间。共有4G,0-2G为用户区,2-4G为系统区。
二、进程的创建过程
      1、系统创建进程内核对象(PCB进程控制块)。
      2、系统为新进程创建虚拟地址空间,帮将可执行文件或任何必要的DLL文件的代码和数据加载到该进程的地址空间。
      3、系统为新进程的主线程创建一个线程内核对象(TCB线程控制块)。
      4、通过执行C/C++运行期启动代码,该主线程开始运行。
      注:在Windows环境下,尽量用多线程而不是多进程。
三、与进程相关的API
1、创建进程
            BOOL CreateProcess(
                    PCTSTR      psApplicationName, //可执行文件的名字
                    PTSTR      pszCommandLine, //命令行字符串
                    PSECURITY_ATTRIBUTES psaProcess,   //进程对象的安全性
                    PSECURITY_ATTRIBUTES psaThread,   //线程对象的安全性
                    BOOL      bInheritHandles, //句柄可继承性
                    DWORD      fdwCreate,   //标识符(优先级)
                    PVOID      pvEnvironment, //指向环境字符串
                    PCTSTR      pszCurDir,   //子进程当前目录
                    PSTARTUPINFO    psiStartInfo,
                    PPROCESS_INFORMATION ppiProcInfo);   //进程线程句柄及ID
2、打开进程
            HANDLE OpenProcess(
                    DWORD dwDesiredAccess, //访问安全属性
                    BOOL bInheritHandle, //继承属性
                    DWORD hProcessId);   //进程ID
            注:获取hPronessId指定的进程的内核对象的句柄
3、终止进程
(1)、主线程的进入点函数返回
(2)、进程自己终止自己
              VOID ExitProcess(
                        UINT fuExitCode); //退出代码
(3)、终止自身进程或其他进程
              BOOL TerminateProcess(
                      HANDLE hProcess, //进程句柄
                      UINT fuExitCode); //退出代码
三、与进程相关的API
4、获取进程的可执行文件或DLL对应的句柄
              HMODULE GetModuleHandle(
                      PCTSTR pszModule); //模块名称
              注:当参数传NULL时获取的是进程的地址空间中可执行文件的基地址。
5、获取与指定窗口关联在一起的一个进程和线程标识符
              HANDLE GetWindowThreadProcessId(
                      HWND hWnd,    //窗口句柄
                      LPDWORD lpdwProcessId); //与该窗口相关的进程ID
6、获取进程的运行时间
              Bool GetProcessTimes(
                      HANDLE hProcess,   //进程句柄
                      PFILETIME pftCreationTime, //创建时间
                      PFILETIME pftExitTime, //退出时间
                      PFILETIME pftKernelTime, //内核时间
                      PFILETIME pftUserTime); //用户时间
              注:返回的时间适用于某个进程中的所有线程(甚至已经终止运行的线程)。
7、获取当前进程的一个伪句柄
              HANDLE GetCurrentProcess();
               注:该函数获取当前进程的伪句柄,通常情况值为-1,只能标识当前进程内核对象,
                      可以复制,但不可继承。不必调用CloseHandle()函数来关闭这个句柄。
8、将进程的伪句柄转换为实句柄
              HANDLE DuplicateHandle(
                      GetCurrentProcess(),
                      GetCurrentProcess(),
                      GetCurrentProcess(),
                      &hProcess,
                      0,
                      FALSE ,
                      DUPLICATE_SAME_ACCESS);
9、获取当前进程ID
              DWORD GetCurrentProcessId();
10、获取进程优先级
              DWORD GetPriorityClass(
                   HANDLE hProcess);
11、修改进程的优先级类
              BOOL SetPriorityClass(
                     HANDLE hProcess, //进程句柄
                     DWORD fdwPriority); //相对进程优先级
              注1:相对线程优先级
                     实时: REALTIME_PRIORITY_CLASS
                     高: HIGH_PRIORITY_CLASS
                     高于正常; ABOVE_NORMAL_PRIORITY_CLASS
                     正常: NORMAL_PRIORITY_CLASS
                     低于正常: BELOW_NORMAL_PRIORITY_CLASS
                     空闲: IDLE_PRIORITY_CLASS
              注2:只要拥有进程的句柄和足够的权限,就能够修改系统中运行的任何进程的优
                       先级类。
12、获取进程句柄计数
              BOOL GetProcessHandleCount(
                      HANDLE hProcess,   //句柄
                      PDWORD pdwHandleCount); //句柄计数
13、获取环境块
              DWORD GetEnvironmentVariable(
                      LPCTSTR lpName, //环境变量的名字
                      LPTSTR lpValue, //存放返回字符串的缓冲区
                      DWORD cchValue); //缓冲区的大小
              注:返回值为返回字符串的长度,当缓存不足时返回所需字符串的长度
14、设置环境块
              BOOL SetEnvironmentVariable(
                      LPCTSTR lpName, //环境变量的名字
                      LPCTSTR lpValue); //存放变量值字符串的缓冲区

[转]Windows多进程编程的更多相关文章

  1. PHP多进程编程实例

    这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...

  2. Linux下的多进程编程

    1.进程 1.1进程的定义 <计算机操作系统>这门课对进程有这样的描述:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统 ...

  3. php多进程编程详解

    php多进程编程 前言 php单进程存在的问题: 多核处理器未充分利用,而单处理器通常需要等待其他操作完成之后才能再继续工作. 任何现代操作系统都可在幕后执行多任务,这意味着在很短时间内,计算机可以调 ...

  4. php多进程编程相关资料(以备参考)

    进程与线程的区别 要了解二者的区别与联系,首先得对进程与线程有一个宏观上的了解. 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位.每一个进程都 ...

  5. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  6. Windows多线程编程入门

    标签(空格分隔): Windows multithread programming 多线程 并发 编程 背景知识 在开始学习多线程编程之前,先来学习下进程和线程 进程 进程是指具有一定独立功能的程序在 ...

  7. 【转】《windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  8. windows多线程编程星球(一)

    以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...

  9. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

随机推荐

  1. 【转】 strcpy和memcpy的区别

    strcpy和memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函 ...

  2. 编译osg的一个错误

    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets! 提示找不到CMAKELIST.T ...

  3. Client默认用户及登录密码(转)

    Client默认用户及登录密码 SAP系统(如ERP.CRM等)安装完成,初始化状态下有若干个客户端(Client).如果是生产系统,一般只有000.001.066等三个Client:如果是IDES系 ...

  4. 拓扑编号 vijos1790

    题意就是拓扑排序,要求1的序号尽可能小,然后2的序号尽可能小,3,4... 一开始很容易想到直接贪心,每次选一个入度为0的点,如果有多个,就选编号最小的那个,但是很容易找到反例. 看了下题解,应该是反 ...

  5. 简单研究Android View绘制一 测量过程

    2015-07-27 16:52:58 一.如何通过继承ViewGroup来实现自定义View?首先得搞清楚Android时如何绘制View的,参考Android官方文档:How Android Dr ...

  6. 我是一只IT小小鸟

    不知不觉中走过了高三的时光,最后也没抓住时间的尾巴,不得不承认自己已经到了大一下学期了.接触了大学生职业生涯规划这门课程,一开始认为学习了这门课程以后就会对自己的未来有一个规划,渐渐的去意识到软件工程 ...

  7. spirng定时任务的两种配置:注解和xml

    一 使用注解Task 1.在applicationContext.xml中配置 <?xml version="1.0" encoding="UTF-8"? ...

  8. 自己常用的8个Web在线工具

    为什么要用 Web 在线工具呢?有两个原因,第一,它不受限于物理平台,我既可以在自己的电脑上使用,也可以在公司或亲戚朋友的电脑上使用(不管对方的操作系统是什么,只要能上网):第二,可以解放硬盘,减少 ...

  9. js禁用回退键backspace解决办法

    本文摘自http://q821424508.iteye.com/blog/1587025 以下为2.0版本,支持IE,firefox,chrome[这三款浏览器经过测试]等浏览器 window.onl ...

  10. Redisson-Parent 2.5.0 和 3.0.0 发布

    Redisson-Parent 2.5.0 和 3.0.0 发布了,Redisson 是基于 Redis 服务之上构建的分布式.可伸缩的 Java 数据结构,高级的 Redis 客户端. Rediss ...