WaitForSingleObject(pi.hProcess, INFINITE)是啥意思
时间: 2024-05-27 12:09:27 浏览: 15
WaitForSingleObject(pi.hProcess, INFINITE) 是一个函数调用,它的作用是等待一个指定的进程对象被 signaled(即进程结束)或者超时。在这个函数中,pi.hProcess 是一个指向被创建的进程的句柄的指针,INFINITE 是等待的时间长度,如果设置为 INFINITE,那么它将一直等待直到进程结束。这个函数通常用于等待子进程的结束,以确保在子进程结束之前不会继续执行父进程的代码。
相关问题
#include<stdio.h> #include<windows.h> int main(void) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); if (!CreateProcess(NULL, "C:\\windows\\system32\\notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { printf("create process failed\n"); return -1; } WaitForSingleObject(pi.hProcess, INFINITE); printf("Child Complete\n"); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; }代码注释
这是一个使用 Windows API 创建进程的 C 语言程序。下面是代码注释:
```c
#include<stdio.h>
#include<windows.h>
int main(void)
{
// 初始化 STARTUPINFO 和 PROCESS_INFORMATION 结构体
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// 创建 Notepad 进程
if (!CreateProcess(NULL,
"C:\\windows\\system32\\notepad.exe", // 可执行文件路径
NULL, // 进程安全描述符
NULL, // 线程安全描述符
FALSE, // 是否继承句柄
0, // 标志位
NULL, // 环境变量
NULL, // 工作目录
&si, // STARTUPINFO 结构体
&pi)) // PROCESS_INFORMATION 结构体
{
printf("create process failed\n");
return -1;
}
// 等待子进程结束
WaitForSingleObject(pi.hProcess, INFINITE);
printf("Child Complete\n");
// 关闭进程和线程的句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
```
#include <windows.h> #include <iostream> using namespace std; const int N = 5; // 进程数 int count = 0; // 计数器 HANDLE mutex = CreateMutex(NULL, FALSE, NULL); // 互斥量 HANDLE barrier = CreateEvent(NULL, TRUE, FALSE, NULL); // 屏障 DWORD WINAPI Process(LPVOID lpParam) { int id = ((int)lpParam); cout << "Process " << id << " arrived at barrier." << endl; WaitForSingleObject(mutex, INFINITE); count++; ReleaseMutex(mutex); if (count == N) { cout << "All processes arrived at barrier, releasing barrier." << endl; SetEvent(barrier); } WaitForSingleObject(barrier, INFINITE); cout << "Process " << id << " starts the next phase of work." << endl; return 0; } DWORD WINAPI Broadcast(LPVOID lpParam) { WaitForSingleObject(mutex, INFINITE); cout << "Broadcast process started." << endl; ReleaseMutex(mutex); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); WaitForSingleObject(barrier, INFINITE); cout << "Broadcast process releasing all processes." << endl; ReleaseMutex(mutex); for (int i = 0; i < N; i++) { ReleaseSemaphore((HANDLE)lpParam, 1, NULL); } return 0; } int main() { HANDLE threads[N]; DWORD threadIds[N]; HANDLE sem = CreateSemaphore(NULL, 0, N, NULL); int ids[N]; for (int i = 0; i < N; i++) { ids[i] = i; threads[i] = CreateThread(NULL, 0, Process, &ids[i], 0, &threadIds[i]); if (threads[i] == NULL) { return 1; } } HANDLE broadcastThread = CreateThread(NULL, 0, Broadcast, sem, 0, NULL); if (broadcastThread == NULL) { return 1; } WaitForMultipleObjects(N, threads, TRUE, INFINITE); WaitForSingleObject(mutex, INFINITE); cout << "All processes completed." << endl; ReleaseMutex(mutex); return 0; }将此代码中的线程替换成进程
将线程替换成进程需要进行如下修改:
1. 需要将代码中的线程函数 Process 改为进程函数 ProcessProc,并修改其参数类型为 LPVOID。
2. 需要将代码中的 Broadcast 线程函数改为进程函数 BroadcastProc,并修改其参数类型为 LPVOID。
3. 需要使用 CreateProcess 函数创建进程,而不是使用 CreateThread 函数创建线程。
4. 进程间通信需要使用共享内存、命名管道或信号量等机制,而不是使用互斥量和事件等线程同步机制。
下面是修改后的代码示例:
#include <windows.h>
#include <iostream>
using namespace std;
const int N = 5; // 进程数
int count = 0; // 计数器
HANDLE mutex; // 互斥量
HANDLE barrier; // 屏障
HANDLE sem; // 信号量
DWORD WINAPI ProcessProc(LPVOID lpParam) {
int id = *((int*)lpParam);
cout << "Process " << id << " arrived at barrier." << endl;
WaitForSingleObject(mutex, INFINITE);
count++;
ReleaseMutex(mutex);
if (count == N) {
cout << "All processes arrived at barrier, releasing barrier." << endl;
SetEvent(barrier);
}
WaitForSingleObject(barrier, INFINITE);
cout << "Process " << id << " starts the next phase of work." << endl;
ReleaseSemaphore(sem, 1, NULL);
return 0;
}
DWORD WINAPI BroadcastProc(LPVOID lpParam) {
cout << "Broadcast process started." << endl;
WaitForSingleObject(barrier, INFINITE);
cout << "Broadcast process releasing all processes." << endl;
for (int i = 0; i < N; i++) {
ReleaseSemaphore(sem, 1, NULL);
}
return 0;
}
int main() {
mutex = CreateMutex(NULL, FALSE, NULL);
barrier = CreateEvent(NULL, TRUE, FALSE, NULL);
sem = CreateSemaphore(NULL, 0, N, NULL);
HANDLE processes[N];
int ids[N];
for (int i = 0; i < N; i++) {
ids[i] = i;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcess(NULL, "Process.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
return 1;
}
processes[i] = pi.hProcess;
CloseHandle(pi.hThread);
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcess(NULL, "Broadcast.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
return 1;
}
HANDLE broadcastProcess = pi.hProcess;
CloseHandle(pi.hThread);
WaitForMultipleObjects(N, processes, TRUE, INFINITE);
cout << "All processes completed." << endl;
CloseHandle(mutex);
CloseHandle(barrier);
CloseHandle(sem);
for (int i = 0; i < N; i++) {
CloseHandle(processes[i]);
}
CloseHandle(broadcastProcess);
return 0;
}
注意:上述代码中的 Process.exe 和 Broadcast.exe 是需要单独编译生成的进程可执行文件。在 Process.exe 中运行 ProcessProc 函数,在 Broadcast.exe 中运行 BroadcastProc 函数。可以使用 Visual Studio 或者其它 C++ 编译器进行编译。