【发布时间】:2011-06-01 02:21:32
【问题描述】:
我试图通过 ctypes 从 Python 中的 libc 调用 reboot 函数,但我无法让它工作。我一直在引用man 2 reboot 页面 (http://linux.die.net/man/2/reboot)。我的内核版本是 2.6.35。
下面是来自交互式 Python 提示符的控制台日志,我试图让我的机器重新启动 - 我做错了什么?
为什么ctypes.get_errno() 不起作用?
>>> from ctypes import CDLL, get_errno
>>> libc = CDLL('libc.so.6')
>>> libc.reboot(0xfee1dead, 537993216, 0x1234567, 0)
-1
>>> get_errno()
0
>>> libc.reboot(0xfee1dead, 537993216, 0x1234567)
-1
>>> get_errno()
0
>>> from ctypes import c_uint32
>>> libc.reboot(c_uint32(0xfee1dead), c_uint32(672274793), c_uint32(0x1234567), c_uint32(0))
-1
>>> get_errno()
0
>>> libc.reboot(c_uint32(0xfee1dead), c_uint32(672274793), c_uint32(0x1234567))
-1
>>> get_errno()
0
>>>
编辑:
通过Nemos 提醒-我可以让get_errno 返回 22(无效参数)。并不意外。我应该怎么打电话给reboot()?我显然没有传递函数期望的参数。 =)
【问题讨论】:
-
运行这个脚本时你是root吗?
-
访问被拒绝?我不知道...尝试(重新)阅读此内容:linux.die.net/man/2/reboot
-
即使访问被拒绝,人们也会期望
errno报告EPERM。 -
是的,在启动 python 交互式提示之前我是 root
标签: python c linux ctypes libc