zoukankan      html  css  js  c++  java
  • 26.windows进程

    1.windows进程

      进程是一个容器,包含程序执行需要的代码、数据、资源等信息。windows是多任务操作系统,可以同时执行多个进程。

      windows进程特点:

        (1)每个进程都有自己的ID

        (2)每个进程都有自己的地址空间,进程之间无法访问对方的地址空间

        (3)每个进程都有自己的安全属性

        (4)每个进程至少包含一个线程

    2.进程环境信息(进程上下文)

      (1)获取和释放环境信息

        获取

          LPVOID  GetEnvironmentStrings( VOID );

        释放

          BOOL  FreeEnvironmentStrings( LPTSTR lpszEnvironmentBlock );

      (2)获取和设置环境变量

          GetEnvironmentVariable

          SetEnvironmentVariable

    3.进程的信息

      (1)进程ID

         GetCurrentProcessId

      (2)进程句柄

         GetCurrentProcess

         返回进程的伪句柄(-1),该句柄访问该进程的所有操作

    4.进程的使用

      (1)创建进程

         WinExec - 早起16位

         ShellExecute - shell操作

         CreateProcess - 目前最多使用

         BOOL  CreateProcess( LPCTSTR                            lpApplicationName,       //引用程序名称(可执行文件的全路径)

                                                  LPTSTR                              lpCommandLine,           //命令行参数(WinMain/main等函数能接收到)

                                                  SECURITY_ATTRIBUTES      lpProcessAttributes,      //进程安全属性

                                                  SECURITY_ATTRIBUTES      lpThreadAttributes,       //线程安全属性

                                                  BOOL                                bInheritHandles,            //当前进程的子进程是否能继承(使用)当前进程句柄

                                                  DWORD                             dwCreationFlags,          //创建方式

                                                  LPVOID                              lpEnvironment,             //环境信息

                                                  LPCTSTR                            lpCurrentDirectory,       //当前(工作)目录

                                                  LPSTARTUPINFO                 lpStartupInfo,               //起始信息

                                                  LPPROCESS_INFOMATION    lpProcessInformation);  //返回进程和线程句柄

      (2)结束进程

         //结束本进程

         VOID  ExitProcess( UINT uExitCode );  //退出码

         //结束某个进程

         BOOL  TerminateProcess( HANDLE  hProcess,     //进程句柄

                                                       UINT       uExitCode);  //退出码

      (3)通过进程ID获取进程句柄

         HANDLE  OpenProcess( DWORD   dwDesiredAccess,  //访问权限

                                                    BOOL       hInheritHandle,     //继承标识

                                                    DWORD   dwProcessId);       //进程ID

         返回进程句柄

      (4)关闭进程句柄

         CloseHandle(不能杀死进程,只是把进程句柄置为-1)

      (5)进程间等候

         //等候可等候句柄(只有无信号和有信号两种状态的句柄)有信号

         DWORD  WaitForSingleObject( HANDLE   hHandle,            //句柄

                                                               DWORD   dwMilliseconds);  //等候时间,毫秒为单位,INFINITE

         阻塞函数,等候句柄的信号,只有句柄有信号或超出等候时间,才会结束。

         目前为止只有进程句柄是可等候句柄,那么进程句柄什么时候是有信号,什么时候是不信号状态呢?

         进程执行中,是无信号状态;进程结束,是由信号状态。

      相关代码:

    #include "stdafx.h"
    #include "windows.h"
    #include "stdio.h"
    
    DWORD g_dwProcId = 0;
    
    void Env()
    {
        char *pszEnv = (char*)GetEnvironmentStrings();
        char *pszText = pszEnv;
        while (pszText[0])
        {
            printf("%s
    ", pszText);
            pszText = pszText + strlen(pszText)+1;
        }
        FreeEnvironmentStrings(pszEnv);
    }
    
    void Variable()
    {
        SetEnvironmentVariable("XXXX", "YYYY");
        char szVar[256] = { 0 };
        GetEnvironmentVariable("XXXX", szVar, 256);
        printf("%s
    ", szVar);
    }
    
    void ProcInfo()
    {
        DWORD nID = GetCurrentProcessId();
        HANDLE hProc = GetCurrentProcess();
        printf("ID=%d, hProc=%d
    ", nID, hProc);
    }
    
    void Proc()
    {
        STARTUPINFO si = { 0 };
        PROCESS_INFORMATION pi = { 0 };
        //创建计算器进程
        CreateProcess("c:/windows/system32/calc.exe", NULL, NULL, NULL, FALSE, 0, "", NULL, &si, &pi);
        printf("ID=%d, 句柄=%d
    ", pi.dwProcessId, pi.hProcess);
        g_dwProcId = pi.dwProcessId;
        //等待计算器进程结束
        WaitForSingleObject(pi.hProcess, INFINITE);
        printf("wait over.
    ");
    }
    
    void Kill()
    {
        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_dwProcId);
        TerminateProcess(hProc, 123);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        //Env();
        //Variable();
        //ProcInfo();
        Proc();
        //Kill();
        return 0;
    }
    View Code
  • 相关阅读:
    练习10.9-2
    [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
    JAVA成员变量为什么不能在类体中先定义后赋值
    core image几个滤镜样例 oc版本号和swift版本号
    UVa 11997 K Smallest Sums 优先队列&&打有序表&&归并
    Android基础新手教程——4.4.1 ContentProvider初探
    Restore IP Addresses -- LeetCode
    Android中Intent传递类对象的方法一(Serializable)
    Effective C++:条款22:将成员变量声明为private
    javascript cookie
  • 原文地址:https://www.cnblogs.com/csqtech/p/5669769.html
Copyright © 2011-2022 走看看