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\n", pszText);
        pszText = pszText + strlen(pszText)+1;
    }
    FreeEnvironmentStrings(pszEnv);
}

void Variable()
{
    SetEnvironmentVariable("XXXX", "YYYY");
    char szVar[256] = { 0 };
    GetEnvironmentVariable("XXXX", szVar, 256);
    printf("%s\n", szVar);
}

void ProcInfo()
{
    DWORD nID = GetCurrentProcessId();
    HANDLE hProc = GetCurrentProcess();
    printf("ID=%d, hProc=%d\n", 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\n", pi.dwProcessId, pi.hProcess);
    g_dwProcId = pi.dwProcessId;
    //等待计算器进程结束
    WaitForSingleObject(pi.hProcess, INFINITE);
    printf("wait over.\n");
}

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

 

posted @ 2016-07-14 11:20  甩锅侠  阅读(206)  评论(0编辑  收藏  举报