Pregunta

Linux admite el envío de una señal Posix arbitraria como SIGINT o SIGTERM a un proceso utilizando el kill-Dominio.Mientras SIGINT y SIGTERM son simplemente viejas y aburridas formas de finalizar un proceso de una manera amigable o no tan amigable, SIGQUIT está destinado a desencadenar un volcado de núcleo.Esto se puede usar para activar una VM Java en ejecución para imprimir un volcado de subprocesos, incluidos los seguimientos de pila de todos los subprocesos en ejecución, ¡excelente!Después de imprimir la información de depuración, Java VM continuará haciendo lo que estaba haciendo antes;de hecho, el volcado del hilo simplemente ocurre en otro hilo generado de máxima prioridad.(Puedes probar esto tú mismo usando kill -3 <VM-PID>.)

Tenga en cuenta que también puede registrar sus propios controladores de señales utilizando el (¡no compatible!) Signal y SignalHandler clases en el sun.misc-paquete, para que puedas divertirte todo tipo de cosas con él.

Sin embargo, todavía tengo que encontrar una manera de enviar una señal a un proceso de Windows. Las señales son creadas por ciertas entradas del usuario: Ctrl-C desencadena un SIGINT en ambas plataformas, por ejemplo.Pero no parece haber ninguna utilidad para enviar manualmente una señal a un proceso en ejecución, pero no interactivo, en Windows.La solución obvia es utilizar Cygwin. kill ejecutable, pero si bien puede finalizar los procesos de Windows utilizando la API de Windows adecuada, no pude enviar un SIGBREAK (el equivalente de Windows a SIGQUIT) con eso;de hecho, creo que la única señal que puede enviar a los procesos de Windows es SIGTERM.

Entonces, para resumir la historia y repetir el titular:¿Cómo envío una señal arbitraria a un proceso en Windows?

¿Fue útil?

Solución

Si lo que quiere es matar explícita / programáticamente otro programa / proceso de cualquier tipo, dentro de las pstools de SysInternals hay una pequeña herramienta llamada " pskill " que se comporta como Unixen " kill " haría.

Si quieres algo más, sigue leyendo (aunque puedo estar equivocado en algunos de los detalles a continuación: han pasado eones desde la última vez que desarrollé un programa de Windows en C usando solo los excelentes libros de WinAPI y Charles Petzold " Programación para Windows & Quot; como guía).

En Windows no tiene correctamente " señales " ;, qué funciones reciben WinMain y WinProc del sistema operativo son simples mensajes . Por ejemplo, cuando hace clic en & Quot; X & Quot; botón de una ventana, Windows envía al controlador de esa ventana el mensaje WM_CLOSE. Cuando se elimina la ventana pero el programa aún se está ejecutando, envía WM_DESTROY. Cuando está a punto de salir del ciclo de procesamiento de mensajes principal, WinMain (no WinProc) recibe WM_QUIT. Su programa debe responder a todos estos como se espera: en realidad puede desarrollar un & "; No se puede cerrar &"; aplicación al no hacer lo que debería al recibir un WM_CLOSE.

Cuando el usuario selecciona la tarea desde el Administrador de tareas de Windows y hace clic en " End Task " ;, el sistema operativo enviará WM_CLOSE (y otro que no recuerdo). Sin embargo, si usa & Quot; End Process & Quot ;, el proceso se interrumpe directamente, nunca se envían mensajes (fuente: La vieja cosa nueva

Recuerdo que había una manera de obtener el HWND de la ventana de otro proceso, una vez que obtenías que otro proceso podía enviar un mensaje a esa ventana a través de las funciones PostMessage y DispatchMessage.

Otros consejos

Windows no es POSIX. No tiene señales. Las únicas 'señales' que reciben los programas de consola son si llaman a SetConsoleCtrlHandler, en cuyo caso se le puede notificar que el usuario presionó Ctrl + C, Ctrl + Break, cerró la ventana de la consola, cerró la sesión o apagó el sistema .

Todo lo demás se hace con IPC, generalmente con mensajes de ventana o RPC. Consulte la documentación de Sun para ver si hay una manera de hacer lo que está pidiendo en el JRE de Windows.

En Windows todo gira en torno a los mensajes de Win32. No creo que haya una herramienta de línea de comandos para hacer esto, pero en C ++ podría usar FindWindow para enviar un mensaje arbitrario a otro programa de Windows. por ejemplo:

#define WM_MYMSG  ( WM_USER+0x100 )
HWND h = ::FindWindow(NULL,_T("Win32App"));
if (h) {
    ::PostMessage(h, WM_MYMSG, 0, 0);
}

Esto también se puede hacer en C # usando interoperabilidad com.

También puede usar jconsole para ver el stacktrace de todos los hilos en ejecución. Esto funcionará en Windows y en cualquier otro sistema operativo que admita Java. jconsole también tiene muchas otras características agradables, gráficos de memoria, gráficos de CPU, etc.

No responde a su pregunta original, pero con suerte le permite obtener los mismos resultados.

Si no está familiarizado con jconsole, consulte el Uso de la documentación de JConsole .

Me pregunto si el PsTools de ahora, Propiedad de Microsoft, SysInternals lo ayudaría.

Ruby es de alguna manera capaz (al menos emular) SIGINT SIGKILL, etc. en Windows y atrapar esos mensajes. Puede que quieras echarle un vistazo.

¿Cómo rubí & "envía señal SIGINT a ese proceso &"; debajo, en Windows, es llamar a TerminateProcess o equivalente en ese PID.

También hay un método equivalente de Windows para " capturar ctrl + c " Me imagino que es lo que llama allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top