Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2011-01-07

KMRCLを眺める(233) REMOVE-SIGNAL-HANDLER

| 19:58 | KMRCLを眺める(233) REMOVE-SIGNAL-HANDLER - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(233) REMOVE-SIGNAL-HANDLER - わだばLisperになる

今回は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

というところ

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20110107