c - 当时间过去时真正杀死当前进程

标签 c windows winapi

我有一个用 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似乎可以解决问题。这留下了几个问题:

  1. 为什么该标志很重要?

  2. 如果我没有在程序中使用任何其他时间操作,是否可以安全地忽略警告“此标志应仅用于短任务,否则可能会影响其他计时器操作。”?

  3. 如果选择多个标志可以解决问题,那么最好使用哪一个标志?

最佳答案

您可以使用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() 传递给参数来填充 ZwTerminateProcessHANDLE 参数。或者,您可以通过 ZwQuerySystemInformation->ZwOpenProcess 扫描进程列表或创建快照 (CreateToolhelp32Snapshot .. . 超出我的想象),然后是 Process32First->Next->OpenProcess - 然后您可以使用 ZwTerminateProcess 终止远程进程,前提是您拥有 SE_DEBUG_PRIVILEGE ,并且当前进程正在以与其他进程相同的完整性级别执行!

关于c - 当时间过去时真正杀死当前进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42432200/

相关文章:

c - 如何修复 pid 取反时 kill 函数的 'No such process' 错误

windows - Netbeans 无法识别项目文件夹

c# - 机器重启后注册表项不存在

c - ListView 滚动条闪烁

c - 获取窗口的当前尺寸,无论最小/正常/最大化状态如何

c - pthreads中pthread_t的数据类型?

c - 语句含义

c# - 最小化时窗口应用程序在任务栏上闪烁橙色

C - 提示第二个输入但不执行任何操作

java - 如何处理java.lang.Exception : Socket bind failed: [730013] exception