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

Python ctypes在Linux上从libc调用reboot(),python,c,linux,ctypes,libc,Python,C,Linux,Ctypes,Libc,我试图通过ctypes从Python中的libc调用reboot函数,但我就是无法让它工作。我一直在引用man 2重新启动页面()。我的内核版本是2.6.35 下面是交互式Python提示符中的控制台日志,我试图在这里让我的机器重新启动-我做错了什么 为什么ctypes.get\u errno()不起作用 >>> from ctypes import CDLL, get_errno >>> libc = CDLL('libc.so.6') >>&g

我试图通过
ctypes
从Python中的libc调用
reboot
函数,但我就是无法让它工作。我一直在引用
man 2重新启动
页面()。我的内核版本是2.6.35

下面是交互式Python提示符中的控制台日志,我试图在这里让我的机器重新启动-我做错了什么

为什么
ctypes.get\u 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
>>>
编辑:

通过提醒-我可以获取
get_errno
以返回22(无效参数)。不足为奇。我应该如何调用
reboot()
?我显然没有传递函数期望的参数。=)

试试看:

>>> libc = CDLL('libc.so.6', use_errno=True)
这应该允许
get\u errno()
工作

[更新]

另外,最后一个参数是
void*
。如果这是64位系统,则整数0不是NULL的有效表示。我会尝试
None
或者
c\u void\u p(None)
。(不过,不知道在这种情况下这有什么关系。)

[更新2]

显然,
reboot(0x1234567)
起到了作用(参见注释)。
libc
中的
reboot()
是系统调用的包装,它只接受
cmd
参数。因此,请尝试:

libc.reboot(0x1234567)

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

运行此脚本时您是root用户吗?访问被拒绝?我不知道。。。尝试(重新)阅读:即使访问被拒绝,人们也会期望
errno
报告
EPERM
。是的,在启动python交互式Promptrying
libc之前,我是root。重新启动(0xfee1dead,672274793,0x1234567,c\u void\u p(None))
仍然返回errno 22。谢谢你的主意。(尝试在参数周围使用
c_uint()
也是如此)您是否尝试过
重新启动(0x1234567)
?这是我在sys/reboot.h中看到的签名…我以为我看到了,但我想没有-这似乎起到了作用。也许可以更新答案?