5

rebootPython経由で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()働くことを可能にするはずです。

[アップデート]

また、最後の引数はvoid *. これが 64 ビット システムの場合、整数 0 は NULL の有効な表現ではありません。私は試してみるNoneか、多分c_void_p(None)。(ただし、このコンテキストでそれがどのように重要になるかはわかりません。)

【アップデート2】

どうやらreboot(0x1234567)そのトリックを行います(コメントを参照)。

于 2011-06-01T02:53:26.903 に答える
3

reboot()inlibcは、syscall のラッパーであり、引数のみを受け取りますcmd。だから試してください:

libc.reboot(0x1234567)

通常は、PID 1 に送信して再起動を開始する必要があることに注意してくださいSIGINT。カーネルに再起動するように指示しても、システム デーモンが完全にシャットダウンする機会が与えられず、ファイルシステム キャッシュがディスクに同期されることさえありません。

于 2011-06-01T03:45:38.523 に答える