进程及其布局

作者: 307656af5a04 | 来源:发表于2019-07-08 06:34 被阅读2次

    一、Windows程序设计背景知识
    1、进程创建和工程意义:进程是一种CPU资源调度得软件手段
    2、CPU的保护模式与进程概念释疑
    3、句柄与内核对象
    二、进程创建
    三、进程控制


    进程及其布局

    一、Windows多任务的实现

    1、多进程(多任务)操作系统

    2、进程是正在运行的应用程序的实例

    二、进程Process和线程thread

    1、进程是正在运行的应用程序的实例,拥有自己的代码、数据和其他系统资源,包含一个或多个线程。

    2、线程是进程内执行代码的独立实体。占有CPU时间片执行指令的是线程。

    3、进程至少包含一个主线程,主线程会创建其他线程。所有线程共享所属进程的内存空间和资源,且仅能访问属于它的进程内存。

    CreateProcess函数详解

    一、启动Windows自带的笔记本程序(核心代码)

        STARTUPINFO si;
        memset(&si, 0, sizeof(si));
        PROCESS_INFORMATION pi;
        char *szCommandLine = "notepad";
        ::CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
    

    二、STARTUPINFO结构

    在创建新进程时会为新进程指定一个STARTUPINFO类型的变量。这些信息将影响新的进程中主线程的主窗口的显示。

    一个进程可以通过GetStartupInfo函数来取得父进程创建自己时使用的STARTUPINFO结构,如下所示:

    memset(&si, 0, sizeof(STARTUPINFO)); // 初始化si全部成员
    

    三、PROCESS_INFORMATION结构

    进程与线程的句柄和ID,时CreateProcess的out参数

    typedef struct _PROCESS_INFOMATION
    {
        HANDLE  hProcess;       // 新建进程内核句柄
        HANDLE  hThread;        // 主线程内核句柄
        DWORD   dwProcessId;    // 新建进程Id
        DWORD   dwThreadId;     // 主线程Id
    }PROCESS_INFOMATION;
    

    四、创建进程的例子

    #include <Windows.h>
    #include <iostream>
    
    int main()
    {
        char *szCommandLine = "notepad";
        STARTUPINFO si;
        memset(&si, 0, sizeof(STARTUPINFO)); // 初始化si全部成员
        si.dwFlags = STARTF_USESHOWWINDOW;  // 指定wShowWindow成员有效
        // 此成员设置为TRUE的话,则显示新建进程的窗口,为FALSE的话则不显示
        si.wShowWindow = TRUE;              
    
        PROCESS_INFORMATION pi;
        
    
        BOOL bRet = ::CreateProcess(
            NULL,                   // 不在此指定可执行文件的文件名
            szCommandLine,          // 命令行参数
            NULL,                   // 默认进程安全性
            NULL,                   // 默认线程安全性
            FALSE,                  // 指定当前进程内的句柄不可被子进程继承
            CREATE_NEW_CONSOLE,     // 为新进程创建一个新的控制台窗口
            NULL,                   // 使用本进程的环境变量
            NULL,                   // 使用本进程的驱动器和目录
            &si, 
            &pi);
    
        if (bRet)
        {
            printf("新进程的进程Id号:%d\n",pi.dwProcessId);
            printf("新进程的主线程Id号:%d\n",pi.dwThreadId);
        }
    
        system("pause");
        return 0;
    }
    
    

    相关文章

      网友评论

        本文标题:进程及其布局

        本文链接:https://www.haomeiwen.com/subject/vwcbhctx.html