问题描述
|
我正在尝试通过ѭ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,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(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来启动重新引导-告诉内核重新引导不会给任何系统守护程序完全关闭的机会,甚至不会将文件系统缓存同步到磁盘。