Linux プラットフォームの ctypes Python モジュールを介して C 共有オブジェクト ライブラリにアクセスする Python アプリケーションがボトル Web サーバーにあります。C so-lib は、デバイス ノード ( ) を開き、/dev/myhwdev
デバイスのファイル記述子に対して IOCTL 関数をアサートします。これは複雑なスタックですが、次のように Python の python-daemon コンテキストでボトル アプリをラップするまではうまく機能します。
# -*- coding: utf-8 -*-
import daemon
import bottle
from bottle import run, route, request
from userlib_via_ctypes_module import *
userlib_grab_device_file_descriptor()
@route('/regread')
def show_regread():
address = request.query.address or request.forms.address
length = request.query.length or request.forms.length
return {'results':assert_ioctl_via_userlib(address, length)}
daemonContext = daemon.DaemonContext(
detach_process = False
)
with daemonContext:
try:
run(host = '0.0.0.0', port = '80', debug = True)
except:
print "(E) Bottle web-service was stopped.\n";
行をコメントアウトwith daemonContext
(およびインデントを修正) するだけで、このコードは正しく機能します (つまり、正しい JSON 結果を提供します)。ただし、daemonContext 内で、userlib の print ステートメントは、デバイス ノードのファイル記述子が正しく開かれていることを示していますが、ioctl 関数はエラー コード -1 でサイレントに失敗します。
デバイスのファイル記述子を閉じて、(userlib コードまたは上記のルート ハンドラのいずれかで) 再度開くと、コマンドが正しく動作するようになります。しかし、デーモンとボトル サーバーがロックし、それ以降のすべての Web リクエストを無視します。
提案?現在、すべてが正常に機能するため、デーモン モジュールをあきらめる準備ができています。
ありがとう!