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 <Windows.h>
#include <winerror.h>
#include <stdio.h>

void main() 
{
	printf_s("child process begins\n");
	Sleep(5000);
	printf_s("child process ends\n");
}

ParentProcess
在这里插入图片描述

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <atlstr.h>

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);
    }
}

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

总结

在运行结果中,观察可返现,“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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值