KMRCLを眺める(233) REMOVE-SIGNAL-HANDLER — #:g1

Posted 2011-01-07 10:58:00 GMT

今回はKMRCLのsignals.lispから、REMOVE-SIGNAL-HANDLERです。
前回はハンドラを設定する方でしたが今回は削除する方です。
定義は、

(defun remove-signal-handler (sig &optional old-handler)
  "Removes a handler from signal. Tries, when possible, to restore old-handler."
  (let ((signum (etypecase sig
                  (integer sig)
                  (keyword (signal-key-to-number sig)))))
    ;; allegro automatically restores old handler, because set-signal-handler above
    ;; actually pushes the new handler onto a list of handlers
    #+allegro (declare (ignore old-handler))
    #+allegro (excl:remove-signal-handler signum)
    #+cmu (system:enable-interrupt signum (or old-handler :default))
    ;; lispworks removes handler if old-handler is nil
    #+(and lispworks unix) (system:set-signal-handler signum old-handler)
    #+sbcl (sb-sys:enable-interrupt signum (or old-handler :default))
    #-(or allegro cmu (and lispworks unix) sbcl)
    (declare (ignore sig handler))
    #-(or allegro cmu (and lispworks unix) sbcl)
    (warn "Signal setting not supported on this platform.")))
となっています。
動作は、
;; USR1へのハンドラを設定
(kl:set-signal-handler :usr1
                       (lambda (&rest args)
                         (declare (ignore args))
                         (princ "Hello USR1 !")
                         (terpri)
                         (force-output)))

:DEFAULT * (sb-posix:getpid) 9776

;; 他のシェルから $ kill -USR1 9776

* Hello USR1 ! ;; USR1のハンドラを削除 (kl:remove-signal-handler :usr1) #<CLOSURE (FLET SB-UNIX::RUN-HANDLER) {1003B40C89}> T

;; 他のシェルから $ kill -USR1 9776 * User defined signal 1

というところ

comments powered by Disqus