process – ¿Cómo adjuntar / conectar dos subprocesos?

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:

  1. Inicie el primer proceso solo con start-process y recuerde su proceso (como objeto lisp).
  2. Inicie el segundo proceso B con async-start-process y elimine A en su finish-func .
  3. Defina un proceso centinela para A que mata a B a la salida de A

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))))

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım