zoukankan      html  css  js  c++  java
  • [转]Windows多进程编程

    转自: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); //存放变量值字符串的缓冲区

  • 相关阅读:
    BZOJ3670: [Noi2014]动物园
    BZOJ4424: Cf19E Fairy
    BZOJ1257: [CQOI2007]余数之和
    BZOJ2438: [中山市选2011]杀人游戏
    SDOI2017第一轮
    BZOJ4820: [Sdoi2017]硬币游戏
    NOIP2016
    HDU1848 Fibonacci again and again(SG 函数)
    HDU1517 Multiply Game
    HDU1907 Jhon
  • 原文地址:https://www.cnblogs.com/xuyuan77/p/5727010.html
Copyright © 2011-2022 走看看