• Windows进程的创建与结束


    实验一

    一、实验内容或题目

    在父进程中创建一个子进程,父进程等待子进程结束再结束。

    二、实验目的与要求

    利用操作系统API,创建一个子进程。再利用操作系统的API等待子进程结束 。

    三、实验步骤(以windows和Visual Studio为例)

    1、创建一个solution,类型为win console application,命名为childProcess
    2、在创建出来的project中,新建一个main.c,编写代码逻辑如下:
    3、输出 “child process begins”
    3、休眠5秒钟(相关的API: Sleep)
    3、输出 “child process ends”
    3、再创建一个project,命名为parentProcess
    3、在新的parentProcess中,新建一个main.c,编写代码逻辑如下:
    4、调用操作系统接口创建唤起childProcess的进程,
    4、调用操作系统接口等待childProcess结束
    5、运行parentProcess,观察运行结果。
    parentProcess的代码可以参照 :https://docs.microsoft.com/en-us/windows/win32/procthread/creating-processes

    四、实验结果

    ChildProcess
    在这里插入图片描述

    #include 
    #include 
    #include 
    
    void main() 
    {
    	printf_s("child process begins\n");
    	Sleep(5000);
    	printf_s("child process ends\n");
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    ParentProcess
    在这里插入图片描述

    #include 
    #include 
    #include 
    #include 
    
    void main()
    {
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
    
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
        ZeroMemory(&pi, sizeof(pi));
    
        //将char转换为TCHAR* argv[]
        char a[] = "C:\\C\\C_language\\ConsoleApplication1\\Debug\\childProcess.exe";
        USES_CONVERSION;
        TCHAR* b = A2T(a);
    
        printf("parent process begins\n");
        BOOL bSuccess = CreateProcess(NULL,
            b,      //发起进程地址
            NULL,          
            NULL,          
            FALSE,          
            0,             
            NULL,         
            NULL,         
            &si,  
            &pi);
        if (!bSuccess)
            printf("CreateProcess failed (%d).\n", GetLastError());
        else
        {
            DWORD dwRet = WaitForSingleObject(pi.hProcess, 2000);
            if (dwRet == WAIT_OBJECT_0)
            {
                printf("创建的线程执行结束\n");
            }
            if (dwRet == WAIT_TIMEOUT)
            {
                printf("等待超时\n");
                //TerminateProcess(pi.hProcess, 0);
                return;
            }
            if (dwRet == WAIT_ABANDONED)
            {
                printf("Abandoned\n");
            }
            printf("parent process ends");
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    运行结果
    在这里插入图片描述

    总结

    在运行结果中,观察可返现,“parent process ends”应该是位于启动子进程之后,但却是优先输出;父进程在子进程结束之后才关闭进程 。

    主要参考
    1. https://docs.microsoft.com/en-us/windows/win32/procthread/creating-processes
    2. https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa
    3. https://stackoverflow.com/questions/42531/how-do-i-call-createprocess-in-c-to-launch-a-windows-executable

    实验二

    一、实验内容或题目

    在实验一的基础上,改写父进程不等待子进程结束。

    二、实验目的与要求

    注释掉实验一中parentProcess代码中等待childProcess的部分,观察实验结果。

    三、实验步骤

    略。

    四、实验结果

    在这里插入图片描述
    设置的等待子进程时间为1毫秒,子进程没有输出任何结果。
    在这里插入图片描述
    设置等待时间为2000毫秒,子进程仅仅输出了“child process begins”。
    在这里插入图片描述

    五、总结:

    如果直接注释掉WaitForSingleObject(),执行结果没有变化,经过实验,我发现这个API并没有终止线程的功能,只是用来捕捉子线程的执行时间(第二个参数为等待的时间),如果想要实现父进程不等待子进程结束,则需要使用官方提供的ExitProcess或者TerminateProcess来实现(官方建议使用ExitProcess)。

    主要参考
    1. https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitforsingleobject
    2. https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-exitprocess
    3. https://docs.microsoft.com/en-us/windows/win32/procthread/creating-a-child-process-with-redirected-input-and-output
    4. https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess
    5. https://blog.csdn.net/p312011150/article/details/82722482
    6. https://blog.csdn.net/qq_26399665/article/details/54296422
    7. https://blog.csdn.net/mvtechnology/article/details/72674524
    8. https://stackoverflow.com/questions/284325/how-to-make-child-process-die-after-parent-exits
  • 相关阅读:
    【Overload游戏引擎细节分析】standard材质Shader
    git使用整理
    Docker CI
    机器人SLAM与自主导航
    草稿草稿草稿,python 和VBA的差别对比汇总 收集ing
    中秋节——嫦娥奔月
    山东中医药大学计算机考研资料汇总
    物联网的应用——工业自动化
    anaconda环境多人同时管理使用
    外汇天眼:Oranco Group不让出金 还擅自关闭投资者账户清除MT5 交易数据
  • 原文地址:https://blog.csdn.net/Fishermen_sail/article/details/127833656