我在瓶子网络服务器中有一个 Python 应用程序,它通过 Linux 平台上的 ctypes Python 模块访问 C 共享对象库。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 中的打印语句显示我的设备节点的文件描述符已正确打开,但 ioctl 函数静默失败,错误代码为 -1。
关闭设备的文件描述符并重新打开它(在 userlib 代码或上述路由处理程序中)允许命令正常工作 - 一次。但是,守护进程和瓶服务器锁定并忽略所有进一步的 Web 请求。
建议?目前,我准备放弃守护程序模块,因为没有它一切正常。
谢谢!