• [转]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不为空时,将创建一个新的环境变量。

  • 相关阅读:
    POJ 1795 DNA Laboratory
    CodeForces 303B Rectangle Puzzle II
    HDU 2197 本源串
    HDU 5965 扫雷
    POJ 3099 Go Go Gorelians
    CodeForces 762D Maximum path
    CodeForces 731C Socks
    HDU 1231 最大连续子序列
    HDU 5650 so easy
    大话接口隐私与安全 转载
  • 原文地址:https://www.cnblogs.com/YQ2014/p/9149735.html
Copyright © 2020-2023  润新知