在父进程中创建一个子进程,父进程等待子进程结束再结束。
利用操作系统API,创建一个子进程。再利用操作系统的API等待子进程结束 。
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");
}
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);
}
}
运行结果

在运行结果中,观察可返现,“parent process ends”应该是位于启动子进程之后,但却是优先输出;父进程在子进程结束之后才关闭进程 。
在实验一的基础上,改写父进程不等待子进程结束。
注释掉实验一中parentProcess代码中等待childProcess的部分,观察实验结果。
略。

设置的等待子进程时间为1毫秒,子进程没有输出任何结果。

设置等待时间为2000毫秒,子进程仅仅输出了“child process begins”。

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