执行 commaind "systeminfo"后,等待单个对象停止
After executing "systeminfo" commaind, waitforsingleobject stopped
所以如果你运行下面的代码,它将永远停止在int retVal = WaitForSingleObject( processInfo.hProcess, INFINITE);
。但是当我运行"ipconfig"或"ping 192.168.0.1"而不是"systeminfo"时,代码可以完美运行。我想知道如何解决问题,导致此问题的原因是什么?
#include <windows.h>
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpComLine,
int nCmdShow)
{
SECURITY_ATTRIBUTES secAttr;
HANDLE hRead,hWrite;
secAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
secAttr.lpSecurityDescriptor = NULL;
secAttr.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&secAttr,0))
{
return FALSE;
}
char command[1024];
strcpy(command, "systeminfo");
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInfo;
startupInfo.cb = sizeof(STARTUPINFO);
GetStartupInfo(&startupInfo);
startupInfo.hStdError = hWrite;
startupInfo.hStdOutput = hWrite;
startupInfo.hStdInput = hRead;
startupInfo.lpTitle = "CMD";
startupInfo.wShowWindow = SW_HIDE;
startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&startupInfo,&processInfo))
{
MessageBox(NULL, "Error", NULL, MB_OK);
CloseHandle(hWrite);
CloseHandle(hRead);
return FALSE;
}
char buffer[1024] = {0};
DWORD bytesRead;
int retVal = WaitForSingleObject( processInfo.hProcess, INFINITE);
if (retVal == WAIT_FAILED)
MessageBox(NULL, "WAIT_FAILED", NULL, MB_OK);
else if (retVal == WAIT_TIMEOUT)
MessageBox(NULL, "WAIT_TIMEOUT", NULL, MB_OK);
ReadFile(hRead,buffer,1024,&bytesRead,NULL);
MessageBox(NULL, buffer, NULL, MB_OK);
CloseHandle(hWrite);
CloseHandle(hRead);
return 0;
}
虽然我在运行您的代码时没有任何问题,但我怀疑我知道这个问题。
您可能会在尝试写入管道句柄的进程和等待它退出的代码之间死锁。
systeminfo
将至少 2K 的数据写入管道。 这可能会超过管道中内置的缓冲区。 但是您的程序不会同时从中读取。 因此,systeminfo 程序无法退出,因为它卡在写入 stdout 时。 并且您的程序会阻止等待应用程序退出。 经典的僵局。 输出不那么多字符的程序工作正常。
我没有时间编写完整的解决方案,但我相信您会希望使用一个循环,该循环为读取句柄和进程句柄执行 WaitForMultipleObjects。 如果可能,请在读取句柄上使用非阻塞或重叠的 I/O。
此外,请按如下所示修改 ReadFile 调用:
DWORD dwResult = ReadFile(hRead,buffer,sizeof(buffer)-1,&bytesRead,NULL);
if (dwResult > 0)
{
buffer[dwResult] = ' ';
}
这样,当整个缓冲区被字符填满时,您可以保证 null 终止。
相关文章:
- 如何限制在C++中为单个类创建的对象数量?
- 为什么平均打印数组元素比打印单个对象慢C++?
- 在C++中有多个指向单个对象的指针的正确方法是什么?
- USB-HID 读/写(重叠)等待单个对象不返回C++
- 使用 new in C++(在 Windows 上)分配大于 2GB 的单个对象
- 如何使用单个对象调用具有相同名称的两个类函数
- 执行 commaind "systeminfo"后,等待单个对象停止
- C++ unordered_map单个对象上的迭代器
- C 中单个对象的线程安全容器
- 哪个更快,单个对象数组或多个数据属性数组
- 有可能实现一个与数组而不是单个对象一起工作的内存池吗
- 将单个对象像一个带有一个元素的数组一样对待,采用一端指针
- 使用模板对单个c++对象和std::对对象进行抽象
- 在DirectX9中旋转单个对象
- 如何在 3D 场景中旋转单个对象
- 等待单个对象不超时
- 如何为单个对象创建不同的接口
- 单个对象访问c++中的两个函数
- 无法在跨多个 DLL 的标头中定义单个对象
- 如何使用gcc使用多个源文件创建单个对象文件