gpt4 book ai didi

c - 42 传递给 TerminateProcess,有时 GetExitCodeProcess 返回 0

转载 作者:可可西里 更新时间:2023-11-01 09:31:53 37 4
gpt4 key购买 nike

在获得 CreateProcess 返回的句柄后,我调用 TerminateProcess,为进程退出代码传递 42。然后,我使用 WaitForSingleObject 终止进程,最后调用 GetExitCodeProcess。

函数调用均未报告错误。子进程是一个无限循环,不会自行终止。

问题是,有时 GetExitCodeProcess 返回 42 作为退出代码(它应该如此),有时返回 0。知道为什么吗?

#include <string>
#include <sstream>
#include <iostream>
#include <assert.h>
#include <windows.h>

void check_call( bool result, char const * call );
#define CHECK_CALL(call) check_call(call,#call);

int
main( int argc, char const * argv[] )
{
if( argc>1 )
{
assert( !strcmp(argv[1],"inf") );
for(;;)
{
}
}
int err=0;
for( int i=0; i!=200; ++i )
{
STARTUPINFO sinfo;
ZeroMemory(&sinfo,sizeof(STARTUPINFO));
sinfo.cb=sizeof(STARTUPINFO);
PROCESS_INFORMATION pe;
char cmd_line[32768];
strcat(strcpy(cmd_line,argv[0])," inf");
CHECK_CALL((CreateProcess(0,cmd_line,0,0,TRUE,0,0,0,&sinfo,&pe)!=0));
CHECK_CALL((CloseHandle(pe.hThread)!=0));
CHECK_CALL((TerminateProcess(pe.hProcess,42)!=0));
CHECK_CALL((WaitForSingleObject(pe.hProcess,INFINITE)==WAIT_OBJECT_0));
DWORD ec=0;
CHECK_CALL((GetExitCodeProcess(pe.hProcess,&ec)!=0));
CHECK_CALL((CloseHandle(pe.hProcess)!=0));
err += (ec!=42);
}
std::cout << err;
return 0;
}

std::string
get_last_error_str( DWORD err )
{
std::ostringstream s;
s << err;
LPVOID lpMsgBuf=0;
if( FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
0,
err,
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPSTR)&lpMsgBuf,
0,
0) )
{
assert(lpMsgBuf!=0);
std::string msg;
try
{
std::string((LPCSTR)lpMsgBuf).swap(msg);
}
catch(
... )
{
}
LocalFree(lpMsgBuf);
if( !msg.empty() && msg[msg.size()-1]=='\n' )
msg.resize(msg.size()-1);
if( !msg.empty() && msg[msg.size()-1]=='\r' )
msg.resize(msg.size()-1);
s << ", \"" << msg << '"';
}
return s.str();
}

void
check_call( bool result, char const * call )
{
assert(call && *call);
if( !result )
{
std::cerr << call << " failed.\nGetLastError:" << get_last_error_str(GetLastError()) << std::endl;
exit(2);
}
}

最佳答案

我认为 nobugz 的评论已经解决了这个问题......

但这是另一个大胆的猜测 - 也许您调用 TerminateProcess() 的时间太晚了很快,并且 Windows 没有完全序列化指定的设置进程错误代码通过 TerminateProcess() 以及它在进程初始化时可能尝试做的任何事情?我认为这不太可能,但可能值得将 Seth suggested 放入 Sleep(1) 调用中(甚至 Sleep(0))调用以查看行为是否发生变化。

此外,您可能需要考虑发布一些人们可以试验的代码。

关于c - 42 传递给 TerminateProcess,有时 GetExitCodeProcess 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061735/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com