org.armedbear.lisp.get-pid.lisp Maven / Gradle / Ivy
(in-package :extensions)
(export '(get-pid)
:extensions)
(defun get-pid ()
"Get the process identifier of this lisp process.
Used to be in SLIME but generally useful, so now back in ABCL proper."
(handler-case
(let* ((runtime
(java::jstatic "getRuntime" "java.lang.Runtime"))
(command
(java::jnew-array-from-array
"java.lang.String" #("sh" "-c" "echo $PPID")))
(runtime-exec-jmethod
;; Complicated because java.lang.Runtime.exec() is
;; overloaded on a non-primitive type (array of
;; java.lang.String), so we have to use the actual
;; parameter instance to get java.lang.Class
(java::jmethod "java.lang.Runtime" "exec"
(java::jcall
(java::jmethod "java.lang.Object" "getClass")
command)))
(process
(java::jcall runtime-exec-jmethod runtime command))
(output
(java::jcall (java::jmethod "java.lang.Process" "getInputStream")
process)))
(java::jcall (java::jmethod "java.lang.Process" "waitFor")
process)
(loop :with b :do
(setq b
(java::jcall (java::jmethod "java.io.InputStream" "read")
output))
:until (member b '(-1 #x0a)) ; Either EOF or LF
:collecting (code-char b) :into result
:finally (return
(parse-integer (coerce result 'string)))))
(t () 0)))