org.armedbear.lisp.get-pid.lisp Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of abcl Show documentation
Show all versions of abcl Show documentation
Common Lisp implementation running on the JVM
(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)))