Pregunta:
El caso general:
En pocas palabras, dado que comienzo dos procesos ( A
y B
) con, por ejemplo, async-start-process
, ¿cuál es la mejor manera de matar a B
si A
termina?
Mi caso de uso específico:
Estoy depurando software integrado en un chip externo y lanzo un servidor GDB que interconecta el chip y GDB de esta manera (gdb ... "-ex \"target remote ...\"")
y quiero eliminar el servidor GDB proceso cuando GDB se cierra.
Edición adicional: sin embargo, sería bueno poder matar el servidor GDB al salir de GDB. Es decir, al revés: presionar q
en el búfer GDB cerraría todo.
Intenté buscar en la documentación de Emacs / elisp, pero soy bastante nuevo en elisp 🙂 ¿Alguna sugerencia?
Respuesta:
Para dos procesos A
y B
se matan mutuamente, puede utilizar el siguiente enfoque:
- Inicie el primer proceso solo con
start-process
y recuerde su proceso (como objeto lisp). - Inicie el segundo proceso
B
conasync-start-process
y elimineA
en sufinish-func
. - Defina un proceso centinela para
A
que mata aB
a la salida deA
Ejemplo de ejecución:
(defun make-kill-other-proc-sentinel (other-proc)
"Create a process-sentinel killing other-proc when called."
(assert (processp other-proc))
`(lambda (proc &optional msg)
(when (eq 'exit (process-status proc))
(unless (eq 'exit (process-status ,other-proc))
(kill-process ,other-proc)))))
(let* ((proc1 (start-process "*A*" "*A*" "xterm" "-T" "A"))
(proc2 (async-start-process "*B*" "xterm" (make-kill-other-proc-sentinel proc1) "-T" "B")))
(if (eq 'exit (process-status proc1))
(kill-process proc2)
(set-process-sentinel proc1 (make-kill-other-proc-sentinel proc2))))