Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “执行后”;系统信息“;commaind,waitforsingleobject已停止_C++_Createprocess_Waitforsingleobject - Fatal编程技术网

C++ “执行后”;系统信息“;commaind,waitforsingleobject已停止

C++ “执行后”;系统信息“;commaind,waitforsingleobject已停止,c++,createprocess,waitforsingleobject,C++,Createprocess,Waitforsingleobject,因此,如果运行下面的代码,它将在int retVal=WaitForSingleObject(processInfo.hProcess,INFINITE)处停止永远。但是当我运行“ipconfig”或“ping192.168.0.1”而不是“systeminfo”时,代码运行得非常好。我想知道如何解决这个问题,是什么原因导致这个问题 #include <windows.h> int WINAPI WinMain( HINSTANCE hInst

因此,如果运行下面的代码,它将在
int retVal=WaitForSingleObject(processInfo.hProcess,INFINITE)处停止永远。但是当我运行“ipconfig”或“ping192.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;
}
#包括
int-WINAPI-WinMain(
HINSTANCE HINSTANCE,
HINSTANCE HPPrevenstance,
LPSTR lpComLine,
国际展览(nCmdShow)
{
安全属性secAttr;
处理线程,hWrite;
secAttr.nLength=sizeof(安全属性);
secAttr.lpSecurityDescriptor=NULL;
secAttr.bInheritHandle=TRUE;
if(!CreatePipe(&hRead,&hWrite,&secAttr,0))
{ 
返回FALSE;
} 
char命令[1024];
strcpy(命令,“系统信息”);
STARTUPINFO STARTUPINFO;
处理信息处理信息;
startupInfo.cb=sizeof(startupInfo);
GetStartupInfo(&startupInfo);
startupInfo.hStdError=hWrite;
startupInfo.hstOutput=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))
{ 
消息框(空,“错误”,空,MB_OK);
闭合手柄(hWrite);
CloseHandle(线程);
返回FALSE;
} 
字符缓冲区[1024]={0};
德沃德·拜特斯雷德;
int-retVal=WaitForSingleObject(processInfo.hProcess,无限);
如果(retVal==等待_失败)
消息框(NULL,“等待失败”,NULL,MB\U确定);
else if(retVal==等待超时)
消息框(NULL,“等待超时”,NULL,MB\U OK);
ReadFile(线程、缓冲区、1024和字节读取、NULL);
MessageBox(空、缓冲区、空、MB_OK);
闭合手柄(hWrite);
CloseHandle(线程);
返回0;
}

虽然我在运行您的代码时没有遇到任何问题,但我怀疑我知道这个问题

您可能会在试图写入管道句柄的进程和等待它退出的代码之间出现死锁

systeminfo
将至少2K的数据写入管道。这可能会超出管道中内置的缓冲区。但是你的程序并没有同时从中读取数据。因此systeminfo程序无法退出,因为它无法写入标准输出。程序块等待应用程序退出。经典的死锁。不输出那么多字符的程序工作正常

我没有时间编写完整的解决方案,但我相信您会希望使用一个循环,该循环对读取句柄和进程句柄都执行WaitForMultipleObjects。如果可能,在读句柄上使用非阻塞或重叠i/o

另外,按如下方式修改ReadFile调用:

DWORD dwResult = ReadFile(hRead,buffer,sizeof(buffer)-1,&bytesRead,NULL);
if (dwResult > 0)
{
   buffer[dwResult] = '\0';
}

这样,当整个缓冲区充满字符时,您就保证了空终止。

好的,您所说的对我来说是有意义的,我有点理解我的程序中的问题是什么。但是,当您在我的编译器上运行相同的代码时,它是如何工作的呢?我还是搞不清楚答案。我想在systeminfo程序完全退出后读取文件。你完全正确,我的计算机上的管道写入buff是4kb。不知怎的,我认为你的电脑上有64kb,这就是为什么它在你的电脑上运行得很好。我使用文件重定向输出而不是管道。我现在可以成功地获得输出,但我仍然为控制台输入任何解决方案?