5

我试图reboot通过 Python 中的 libc 调用该函数,ctypes但我无法让它工作。我一直在引用该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()?我显然没有传递函数期望的参数。=)

4

2 回答 2

4

尝试:

>>> libc = CDLL('libc.so.6', use_errno=True)

那应该允许get_errno()工作。

[更新]

此外,最后一个参数是 a void *。如果这是 64 位系统,则整数 0 不是 NULL 的有效表示。我会尝试None或者也许c_void_p(None)。(不过,不确定这在这种情况下有何影响。)

[更新 2]

显然reboot(0x1234567)是诀窍(见评论)。

于 2011-06-01T02:53:26.903 回答
3

reboot()inlibc是系统调用的包装器,它只接受参数cmd。所以试试:

libc.reboot(0x1234567)

请注意,您通常应该通过发送SIGINT到 PID 1 来启动重新启动 - 告诉内核重新启动不会给任何系统守护进程干净关闭的机会,甚至不会将文件系统缓存同步到磁盘。

于 2011-06-01T03:45:38.523 回答