我有一个用 C 编写的 Win32 控制台程序,它需要在经过一定时间长度后终止,即使它仍然很忙。目前我正在这样做:
static VOID CALLBACK timeout(PVOID a, BOOLEAN b) { ExitProcess(0); }
...
HANDLE timer = 0;
CreateTimerQueueTimer(&timer, 0, timeout, 0, (DWORD)(time_limit * 1000),
0, 0);
在达到时间限制时程序计算繁忙的情况下,这可以正常工作,例如它很容易通过一个测试用例,我在 main
中放置了一个无限循环。然而,有一种情况是不起作用的,程序会无限期地挂起。这种情况与被父进程调用有关,我不知道到底发生了什么,对此提出了一个单独的问题。我的问题是:
是否有办法告诉 Windows 在一定秒数后真正终止当前进程,无论如何?
更新:刚刚实验过,WT_EXECUTEINTIMERTHREAD
似乎可以解决问题。这留下了几个问题:
为什么该标志很重要?
如果我没有在程序中使用任何其他时间操作,是否可以安全地忽略警告“此标志应仅用于短任务,否则可能会影响其他计时器操作。”?
如果选择多个标志可以解决问题,那么最好使用哪一个标志?
最佳答案
您可以使用SleepEx
Suspends the current thread until the specified condition is met. Execution resumes when one of the following occurs: AN I/O completion callback function is called, AN asynchronous procedure call (APC) is queued to the thread OR The time-out interval elapses.
第三个或第一个选项是您最好的选择。无论程序中的情况如何,第一个函数的条件应该是您想要的情况。或者预先配置的时间。
SleepEx
后续调用 ZwTerminateProcess来自NTDLL.DLL
。这将确保进程终止,因为调用 ExitProcess
在调用 ZwTerminateProcess/Thread
之前会执行事先检查。这里你可以自己调用并确保终止!您可以通过将 GetCurrentProcess()
传递给参数来填充 ZwTerminateProcess
的 HANDLE
参数。或者,您可以通过 ZwQuerySystemInformation->ZwOpenProcess
扫描进程列表或创建快照 (CreateToolhelp32Snapshot
.. . 超出我的想象),然后是 Process32First->Next->OpenProcess
- 然后您可以使用 ZwTerminateProcess
终止远程进程,前提是您拥有 SE_DEBUG_PRIVILEGE
,并且当前进程正在以与其他进程相同的完整性级别执行!
关于c - 当时间过去时真正杀死当前进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42432200/