Report proper process status
Now that #26 (closed) is taken care of (I tested that the behaviour is now as expected), one might want to try and make process-status
useful.
Here's a bit of code that repeatedly sends a process to sleep and wakes it up again:
;; CMUCL: make sure to use a version >21b (not yet released as of 2017-94-04)
;; because of https://gitlab.common-lisp.net/cmucl/cmucl/issues/26
;; ECL: make sure to use a version >16.1.3 (not yet released as of 2017-09-04)
;; because of https://gitlab.com/embeddable-common-lisp/ecl/issues/273
#+clozure (use-package :ccl)
#+sbcl (use-package :sb-ext)
#+cmu (use-package :ext)
#+mkcl (use-package :mk-ext)
#+clozure (setf (fdefinition 'process-output) #'external-process-output-stream)
#+ecl (setf (fdefinition 'process-output) #'ext:external-process-output)
(defun my-run-program (&rest rest)
#+ecl (nth-value 2 (apply #'ext:run-program rest))
#+mkcl (nth-value 1 (apply #'mk-ext:run-program rest))
#-(or ecl mkcl) (apply #'run-program rest))
(defconstant +sigstop+
#+clozure (symbol-value (read-from-string "#$SIGSTOP"))
#+cmu unix:sigstop
#+ecl ext:+sigstop+
#+sbcl (progn (require :sb-posix)
(symbol-value (find-symbol (symbol-name :sigstop)
(find-package :sb-posix))))
#-(or clozure cmu ecl sbcl) (or #+darwin 17 #-darwin 19)) ; FIXME
(defconstant +sigtstp+
#+clozure (symbol-value (read-from-string "#$SIGTSTP"))
#+cmu unix:sigtstp
#+ecl ext:+sigtstp+
#+sbcl (progn (require :sb-posix)
(symbol-value (find-symbol (symbol-name :sigtstp)
(find-package :sb-posix))))
#-(or clozure cmu ecl sbcl) (or #+darwin 18 #-darwin 20)) ; FIXME
(defconstant +sigcont+
#+clozure (symbol-value (read-from-string "#$SIGCONT"))
#+cmu unix:sigcont
#+ecl ext:+sigcont+
#+sbcl (progn (require :sb-posix)
(symbol-value (find-symbol (symbol-name :sigcont)
(find-package :sb-posix))))
#-(or clozure cmu ecl sbcl) (or #+darwin 19 #-darwin 18)) ; FIXME
(defun internal-status (process)
#+clozure (external-process-status process)
#+(or sbcl cmu) (process-status process)
#+ecl (ext:external-process-status process)
#+mkcl (mk-ext:process-status process))
(defun external-kill (pid signal)
(my-run-program "/usr/bin/env" (list "kill"
(format nil "-~a" signal)
(format nil "~a" pid))))
(defun get-pid (process)
#+clozure (ccl::external-process-pid process)
#+ecl (ext:external-process-pid process)
#+(or sbcl cmu) (process-pid process)
#+mkcl (mkcl:process-id process))
(let* ((p (my-run-program "/bin/sleep" '("5") :wait nil))
(pid (get-pid p)))
(format t "internal status: ~a (expected: running)~%" (internal-status p))
(external-kill pid +sigstop+)
(sleep 1)
(format t "internal status: ~a (expected: stopped)~%" (internal-status p))
(external-kill pid +sigcont+)
(sleep 1)
(format t "internal status: ~a (expected: running/resumed)~%" (internal-status p))
(external-kill pid +sigstop+)
(sleep 1)
(format t "internal status: ~a (expected: stopped)~%" (internal-status p))
(external-kill pid +sigcont+)
(sleep 1)
(format t "internal status: ~a (expected: running/resumed)~%" (internal-status p))
(sleep 5)
(format t "internal status: ~a (expected: exited)~%" (internal-status p)))
A recent git checkout (from the develop branch) of ECL e.g. handles this as expected:
internal status: RUNNING (expected: running)
internal status: STOPPED (expected: stopped)
internal status: RESUMED (expected: running/resumed)
internal status: STOPPED (expected: stopped)
internal status: RESUMED (expected: running/resumed)
internal status: EXITED (expected: exited)
CMUCL, meanwhile, unfortunately does not:
internal status: RUNNING (expected: running)
internal status: STOPPED (expected: stopped)
internal status: STOPPED (expected: running/resumed)
internal status: STOPPED (expected: stopped)
internal status: STOPPED (expected: running/resumed)
internal status: EXITED (expected: exited)