網(wǎng)站首頁 編程語言 正文
實(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)程 。
主要參考
- https://docs.microsoft.com/en-us/windows/win32/procthread/creating-processes
- https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa
- 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)。
主要參考
- https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitforsingleobject
- https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-exitprocess
- https://docs.microsoft.com/en-us/windows/win32/procthread/creating-a-child-process-with-redirected-input-and-output
- https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess
- https://blog.csdn.net/p312011150/article/details/82722482
- https://blog.csdn.net/qq_26399665/article/details/54296422
- https://blog.csdn.net/mvtechnology/article/details/72674524
- https://stackoverflow.com/questions/284325/how-to-make-child-process-die-after-parent-exits
原文鏈接:https://blog.csdn.net/Fishermen_sail/article/details/127833656
相關(guān)推薦
- 2022-05-25 <C++>詳解類對象作為類成員時(shí)調(diào)用構(gòu)造和析構(gòu)的時(shí)機(jī)及靜態(tài)成員解釋
- 2022-09-26 Ubuntu 22.04 源碼安裝 openssl 1.1 error while loading
- 2022-11-17 解讀Python中字典的key都可以是什么_python
- 2022-07-07 Python數(shù)據(jù)分析之?Matplotlib?3D圖詳情_python
- 2022-04-30 C語言程序環(huán)境中的預(yù)處理詳解_C 語言
- 2022-08-16 C#?IEnumerator枚舉器的具體使用_C#教程
- 2022-08-17 C++詳細(xì)分析lambda表達(dá)式的本質(zhì)_C 語言
- 2023-02-09 c++報(bào)錯(cuò)問題解決方案lvalue?required?as?left?operand?of?assi
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支