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

| 我正在尝试通过ѭ1from从Python中的libc调用
reboot
函数,但我无法使其正常工作。我一直在参考ѭ2页面(http://linux.die.net/man/2/reboot)。我的内核版本是2.6.35。 以下是交互式Python提示符下的控制台日志,我试图在该日志中重启计算机-我在做什么错? ѭ3为什么不起作用?
>>> 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()
?我显然没有传递函数期望的参数。 =)     
已邀请:
        尝试:
>>> libc = CDLL(\'libc.so.6\', use_errno=True)
那应该允许ѭ8起作用。 [更新] 另外,最后一个参数是
void *
。如果这是64位系统,则整数0不是NULL的有效表示。我会尝试10英镑或11英镑。 (不过,不确定在这种情况下这有什么关系。) [更新2] 显然,ѭ12可以解决问题(请参阅注释)。     
        
libc
中的
reboot()
是syscall的包装,仅使用
cmd
参数。因此,请尝试:
libc.reboot(0x1234567)
请注意,通常您应该通过向PID 1发送ѭ17来启动重新引导-告诉内核重新引导不会给任何系统守护程序完全关闭的机会,甚至不会将文件系统缓存同步到磁盘。     

要回复问题请先登录注册