Посылка произвольного сигнала в Windows?
Linux поддерживает отправку произвольного Posix-сигнала, такого как SIGINT или SIGTERM процессу с помощью команды kill. В то время как SIGINT и SIGTERM-это просто скучные старые способы закончить процесс дружелюбным или не очень дружелюбным способом, SIGQUIT предназначен для запуска дампа ядра. Это может быть использовано для запуска запущенной виртуальной машины Java, чтобы распечатать дамп потока, включая stacktraces всех запущенных потоков-аккуратно! После печати отладочной информации виртуальная машина Java продолжит выполнять все, что она делала до этого.; на самом деле дамп потока просто происходит в другом порожденном потоке с максимальным приоритетом. (Вы можете попробовать это самостоятельно, используя kill -3 <VM-PID>.)
Обратите внимание, что вы также можете зарегистрировать свои собственные обработчики сигналов, используя (неподдерживаемый!) Signal и SignalHandler классы в sun.misc-пакете, так что вы можете иметь все виды удовольствия с ним.
однако мне еще предстоит найти способ послать сигнал в процесс Windows. сигналы создаются определенными входами пользователя: Ctrl-C триггеры a SIGINT на обоих платформы, например. Но, похоже, нет никакой утилиты, чтобы вручную отправить сигнал запущенному, но неинтерактивному процессу в Windows. Очевидным решением является использование исполняемого файла Cygwin kill, но, хотя он может завершать процессы Windows с помощью соответствующего API Windows, я не смог отправить с ним SIGBREAK (эквивалент Windows SIGQUIT); на самом деле я думаю, что единственный сигнал, который он может послать процессам Windows, - это SIGTERM.
Итак, чтобы сделать длинную историю короткой и повторить заголовок: Как отправить произвольный сигнал процессу в Windows?
6 ответов:
Если вы хотите явно / программно убить другую программу / процесс любого рода, в pstools SysInternals есть небольшой инструмент под названием "pskill", который ведет себя так же, как Unixen" kill".
Если вы хотите что - то еще, продолжайте читать (хотя я могу ошибаться в некоторых деталях ниже-прошла целая вечность с тех пор, как я в последний раз разрабатывал программу для Windows на C, используя только WinAPI и отличные книги Чарльза Петцольда "программирование для Windows" в качестве руководства).
ВКЛ. Windows у вас нет правильных "сигналов", какие функции WinMain и WinProc получают от операционной системы-это простые сообщения. Например, когда вы нажимаете на кнопку" X " окна, Windows отправляет этому обработчику windows сообщение WM_CLOSE. Когда окно удалено, но программа все еще работает, он отправляет WM_DESTROY. Когда он собирается выйти из основного цикла обработки сообщений, WinMain (не WinProc) получает WM_QUIT. Ваша программа должна реагировать на все это, как и ожидалось - вы можете на самом деле разработать приложение "unclosable", не делая того, что он должен делать при получении WM_CLOSE.
Когда пользователь выбирает задачу из Диспетчера задач Windows и нажимает кнопку "завершить задачу", ОС отправляет WM_CLOSE (и еще один, который я не помню). Однако если вы используете "End Process", процесс убивается напрямую, никаких сообщений никогда не отправляется (источник: the Old New Thing
Я помню, что был способ получить HWND окна другого процесса, как только вы получите этот другой процесс может отправить это окно сообщение через функции PostMessage и DispatchMessage.
Windows-это не POSIX. У него нет сигналов. Единственный "сигнал", который получают консольные программы, - это вызов
SetConsoleCtrlHandler, в этом случае можно уведомить, что пользователь нажал Ctrl+C, Ctrl + Break, закрыл окно консоли, вышел из системы или выключил систему.Все остальное делается с помощью IPC, обычно с помощью сообщений окна или RPC. Проверьте документацию Sun, чтобы увидеть, есть ли способ сделать то, что вы просите на Windows JRE.
В Windows все вращается вокруг сообщений Win32. Я не верю, что существует инструмент командной строки для этого, но в C++ вы можете использовать FindWindow для отправки произвольного сообщения другой программе Windows. например:
#define WM_MYMSG ( WM_USER+0x100 ) HWND h = ::FindWindow(NULL,_T("Win32App")); if (h) { ::PostMessage(h, WM_MYMSG, 0, 0); }Это также можно сделать в C# с помощью com-взаимодействия.
Вы также можете использовать jconsole для просмотра stacktrace всех запущенных потоков. Это будет работать на Windows, и любой другой ОС, которая поддерживает Java. jconsole также имеет много других приятных функций, графики памяти, графики процессора и т. д.
Это не ответ на ваш первоначальный вопрос, но, надеюсь, позволит вам получить те же результаты.
Если вы не знакомы с jconsole, ознакомьтесь с документацией Using JConsole.
Мне просто интересно, помогут ли вам PsTools от, теперь принадлежащего Microsoft, SysInternals.
Ruby каким-то образом может (по крайней мере, эмулировать) SIGINT SIGKILL и т. д. на окнах, и ловить эти сообщения. Может, стоит проверить.
Как ruby делает "send signal SIGINT to that process" внизу, в windows, на самом деле, чтобы вызвать
TerminateProcessили эквивалент на этом PID.Есть также эквивалентный метод windows для "ловли ctrl+c", я думаю, что это то, что он там называет.
Comments