12

私はこの件について少し調査しましたが、空白を見つけています。Common Lisp で Unix シグナル処理を行う実装依存の方法があるようですが、シグナル処理を行うクロス実装方法を提供するパッケージはありますか?

私は主に SIGINT をリッスンし、アプリで正常にシャットダウンしたいと考えています。LinuxでClozure CL 1.7を使用しています...前述のように、これはパッケージに最適ですが、実装固有のコードに頼らなければならない場合は問題ありません。

また、SIGINT を使用することに完全に同意しているわけではありません (理想的ではありますが)。必要に応じて別の信号を使用できます。

これが厄介になる場合、アプリの外部から Lisp アプリを適切にシャットダウンするための他の提案はありますか? 私が持っていた 1 つのアイデアは、アプリが監視するファイルを作成し、ファイルが検出された場合はシャットダウンすることです...ハックのようなものですが。

ありがとう!

4

4 に答える 4

8

私はもともとCFFIの使用に関するDaimrodのコメント(質問の下の最初のコメント)に懐疑的でしたが、もう少し調べてhttp://clozure.com/pipermail/openmcl-devel/2010-July/011675を見つけました。 html。私はそれをCFFIを使用するように適合させ、これがLinux上のSBCL / CCL / clisp(おそらく他のもの)で動作することを確認しました。

(defmacro set-signal-handler (signo &body body)
  (let ((handler (gensym "HANDLER")))
    `(progn
       (cffi:defcallback ,handler :void ((signo :int))
         (declare (ignore signo))
         ,@body)
       (cffi:foreign-funcall "signal" :int ,signo :pointer (cffi:callback ,handler)))))

(set-signal-handler 2
  (format t "Quitting lol!!!11~%")
  ;; fictional function that lets the app know to quit cleanly (don't quit from callback)
  (signal-app-to-quit))

私が理解していることから、コールバックの本文にあるものはすべて短くて甘いものでなければならないことに注意してください!長い処理はありません。nilリンクされた記事では、マクロは実際にはシグナルを処理するためだけに別のスレッドを作成します。これは、グローバル変数をからに設定しtて返すだけなので、私の目的にはやり過ぎです。

とにかく、うまくいけば、これは他の人に役立つでしょう!

于 2012-05-04T02:54:23.520 に答える
7

シグナル処理用の一般的なライブラリも見つかりません。ただし、Slimeはほとんどの Lisp 実装に対して「カスタムSIGINTハンドラの作成」を実装しています。そのコードの CCL ケースを調べたところ、ccl:*break-hook*. ccl:*break-hook*ドキュメントにはありませんが、導入されたコミットはhereにあります。

この簡単なサンプル コードは、私のシステム (CCL 1.8、linux x86) で動作します。

(setf ccl:*break-hook* 
  (lambda (cond hook)                              
    (declare (ignore cond hook))
    (format t "Cleaning up ...")
    (ccl:quit)))

このコードが非 Slime REPL に入力された後、送信SIGINTすると、プログラムは「Cleaning up ...」と出力して終了します。

于 2012-03-31T01:19:32.537 に答える
1

SBCL を使用する場合、SBCL をクラッシュさせずにシグナル マスクを変更することはできません。SBCL を修正する方法についての彼のヒントについて nyef に尋ねてください...

于 2015-08-24T17:50:35.183 に答える