Python的ctypes从Linux上的libc调用reboot()

我试图通过ctypes从Python中的libc调用rebootfunction,我只是不能得到它的工作。 我一直在引用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() ? 我显然没有传递函数期望的参数。 =)

Solutions Collecting From Web of "Python的ctypes从Linux上的libc调用reboot()"

尝试:

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

这应该允许get_errno()工作。

[更新]

另外,最后一个参数是void * 。 如果这是一个64位系统,那么整数0不是NULL的有效表示。 我会尝试Nonec_void_p(None) 。 (不知道在这方面如何可能重要。

[更新2]

显然reboot(0x1234567)做的伎俩(见评论)。

libcreboot()是syscall的一个包装,它只接受cmd参数。 所以试试:

 libc.reboot(0x1234567) 

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