日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Windows進(jìn)程的創(chuàng)建與結(jié)束

作者:Fishermen_sail 更新時(shí)間: 2022-11-14 編程語言

實(shí)驗(yàn)一

一、實(shí)驗(yàn)內(nèi)容或題目

在父進(jìn)程中創(chuàng)建一個(gè)子進(jìn)程,父進(jìn)程等待子進(jìn)程結(jié)束再結(jié)束。

二、實(shí)驗(yàn)?zāi)康呐c要求

利用操作系統(tǒng)API,創(chuàng)建一個(gè)子進(jìn)程。再利用操作系統(tǒng)的API等待子進(jìn)程結(jié)束 。

三、實(shí)驗(yàn)步驟(以windows和Visual Studio為例)

1、創(chuàng)建一個(gè)solution,類型為win console application,命名為childProcess
2、在創(chuàng)建出來的project中,新建一個(gè)main.c,編寫代碼邏輯如下:
3、輸出 “child process begins”
3、休眠5秒鐘(相關(guān)的API: Sleep)
3、輸出 “child process ends”
3、再創(chuàng)建一個(gè)project,命名為parentProcess
3、在新的parentProcess中,新建一個(gè)main.c,編寫代碼邏輯如下:
4、調(diào)用操作系統(tǒng)接口創(chuàng)建喚起childProcess的進(jìn)程,
4、調(diào)用操作系統(tǒng)接口等待childProcess結(jié)束
5、運(yùn)行parentProcess,觀察運(yùn)行結(jié)果。
parentProcess的代碼可以參照 :https://docs.microsoft.com/en-us/windows/win32/procthread/creating-processes

四、實(shí)驗(yàn)結(jié)果

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轉(zhuǎn)換為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,      //發(fā)起進(jìn)程地址
        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("創(chuàng)建的線程執(zhí)行結(jié)束\n");
        }
        if (dwRet == WAIT_TIMEOUT)
        {
            printf("等待超時(shí)\n");
            //TerminateProcess(pi.hProcess, 0);
            return;
        }
        if (dwRet == WAIT_ABANDONED)
        {
            printf("Abandoned\n");
        }
        printf("parent process ends");
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }
}

運(yùn)行結(jié)果
在這里插入圖片描述

總結(jié)

在運(yùn)行結(jié)果中,觀察可返現(xiàn),“parent process ends”應(yīng)該是位于啟動子進(jìn)程之后,但卻是優(yōu)先輸出;父進(jìn)程在子進(jìn)程結(jié)束之后才關(guān)閉進(jìn)程 。

主要參考

  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

實(shí)驗(yàn)二

一、實(shí)驗(yàn)內(nèi)容或題目

在實(shí)驗(yàn)一的基礎(chǔ)上,改寫父進(jìn)程不等待子進(jìn)程結(jié)束。

二、實(shí)驗(yàn)?zāi)康呐c要求

注釋掉實(shí)驗(yàn)一中parentProcess代碼中等待childProcess的部分,觀察實(shí)驗(yàn)結(jié)果。

三、實(shí)驗(yàn)步驟

略。

四、實(shí)驗(yàn)結(jié)果

在這里插入圖片描述
設(shè)置的等待子進(jìn)程時(shí)間為1毫秒,子進(jìn)程沒有輸出任何結(jié)果。
在這里插入圖片描述
設(shè)置等待時(shí)間為2000毫秒,子進(jìn)程僅僅輸出了“child process begins”。
在這里插入圖片描述

五、總結(jié):

如果直接注釋掉WaitForSingleObject(),執(zhí)行結(jié)果沒有變化,經(jīng)過實(shí)驗(yàn),我發(fā)現(xiàn)這個(gè)API并沒有終止線程的功能,只是用來捕捉子線程的執(zhí)行時(shí)間(第二個(gè)參數(shù)為等待的時(shí)間),如果想要實(shí)現(xiàn)父進(jìn)程不等待子進(jìn)程結(jié)束,則需要使用官方提供的ExitProcess或者TerminateProcess來實(shí)現(xiàn)(官方建議使用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

原文鏈接:https://blog.csdn.net/Fishermen_sail/article/details/127833656

欄目分類
最近更新