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

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

    一、进程的概念

      进程是是一个正在运行的程序的实例,是系统分配资源的单位(线程是执行的单位),包括内存,打开的文件、处理机、外设等,进程由两部分组成:

      1. 进程的内核对象:即我们通常所讲的PCB(进程控制块),该结构只能由该内核访问,他是操作系统用来管理进程的一个数据结构,操作系统通过该数据结构来感知和管理进程;它的成员负责维护进程的各种信息,包括进程的状态(创建、就绪、运行、睡眠、挂起、僵死等)、消息队列等;同时也是系统用来存放关于进程的统计信息的地方。

      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、打开进程 (获取hProcessId对应的进程的内核对象句柄)
                HANDLE OpenProcess(
                        DWORD dwDesiredAccess, //访问安全属性
                        BOOL bInheritHandle,  //继承属性
                        DWORD hProcessId);   //进程ID

      3、终止进程
        (1)主线程的进入点函数返回
        (2)进程自己终止自己
                    VOID ExitProcess(
                              UINT fuExitCode); //退出代码
        (3)终止自身进程或其他进程
                    BOOL TerminateProcess(
                            HANDLE hProcess, //进程句柄
                            UINT fuExitCode); //退出代码

      4、获取进程的可执行文件或DLL对应的句柄
                  HMODULE GetModuleHandle(
                          PCTSTR pszModule); //模块名称
                  注:当参数传NULL时获取的是进程的地址空间中可执行文件的基地址。

      5、找出某个指定窗口的创建者(线程或进程),返回创建者的ID。哪个线程创建了这个窗口,返回的就是这个线程的id号 (进程只有一个线程的话,那么线程标志符与进程标志符就是指同一个标志符)。
                  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()函数来关闭这个句柄。
                        伪句柄只能用于进程内部,如果你想得到实际得句柄,在进程间进行通讯,必需要进行转化,调用DuplicateHandle,注意,得实句柄使用完成以后,你必须要调用CloseHandle去关闭.

      8、将进程的伪句柄转换为实句柄
                  HANDLE DuplicateHandle(
                            GetCurrentProcess(),
                            GetCurrentProcess(),
                            GetCurrentProcess(),
                            &hProcess,
                            0,
                            FALSE ,
                            DUPLICATE_SAME_ACCESS); 

        注:实例句柄必须要调用CloseHandle()函数来关闭这个句柄,否则有句柄泄露。

      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); //缓冲区的大小
                  注:返回值为返回字符串的长度,当缓存不足时返回所需字符串的长度。常用的系统环境变量如下:

     1 WINDIR:                 //系统目录 - C:WINDOWS  
     2 SYSTEMROOT:             //系统目录 - C:WINDOWS  
     3 SYSTEMDRIVE:            //系统根目录 - C:  
     4 HOMEDRIVE:              //当前用户根目录 - C:  
     5 USERPROFILE:            //当前用户目录 - C:UsersKandy  
     6 HOMEPATH:               //当前用户路径 - UsersKandy  
     7 TMP:                    //当前用户临时文件夹 - C:UsersKandyAppDataLocalTemp  
     8 TEMP:                   //当前用户临时文件夹 - C:UsersKandyAppDataLocalTemp  
     9 APPDATA:                //当前用户数据文件夹 - C:UsersKandyAppDataRoaming  
    10 PROGRAMFILES:           //程序默认安装目录 - C:Program Files (x86)  
    11 COMMONPROGRAMFILES:     //文件通用目录 - C:Program Files (x86)Common Files  
    12 USERNAME:               //当前用户名 - Kandy  
    13 ALLUSERSPROFILE:        //所有用户文件目录 - C:ProgramData  
    14 OS:                     //操作系统名 - Windows_NT  
    15 COMPUTERNAME:           //计算机名 - KANDY-PC  
    16 NUMBER_OF_PROCESSORS:   //处理器个数 - 4  
    17 PROCESSOR_ARCHITECTURE: //处理器芯片架构 - x86  
    18 PROCESSOR_LEVEL:        //处理器型号 - 6  
    19 PROCESSOR_REVISION:     //处理器修订号 - 3c03  
    20 USERDOMAIN:             //包含用户帐号的域 - KANDY-PC  
    21 COMSPEC:                //C:WINDOWSsystem32cmd.exe  
    22 PATHEXT:                //执行文件类型 - .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC  
    23 PATH:                   //搜索路径  

      14、设置环境变量
                  DWORD SetEnvironmentVariable(
                            LPCTSTR lpName, //环境变量的名字
                            LPCTSTR lpValue); //存放变量值字符串的缓冲区
                  注:当环境变量lpName不存在,且lpValue不为空时,将创建一个新的环境变量。

  • 相关阅读:
    python数据结构之图的实现方法
    大数据将如何颠覆信任危机
    大数据将如何颠覆信任危机
    JQuery的入门(二)
    递归思想
    Jquery的入门(一)
    如果让你写一个消息队列,该如何进行架构设计啊?
    如何解决消息队列的延时以及过期失效问题?消息队列满了以后怎么处理?有几百万消息持续积压 几小时.怎么解决?
    如何保证消息的顺序性?
    如何保证消息在传送的过程中不会丢失?(如何保证消息的可靠性传输?)
  • 原文地址:https://www.cnblogs.com/YQ2014/p/9149735.html
Copyright © 2011-2022 走看看