Ctypes Python, вызывающие reboot () из libc в Linux - PullRequest
5 голосов
/ 01 июня 2011

Я пытаюсь вызвать функцию reboot из libc в Python через 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()? Я явно не передаю аргументы, которые ожидает функция. =)

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Попробуйте:

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

Это должно позволить get_errno() работать.

[обновление]

Кроме того, последний аргумент - void *.Если это 64-битная система, то целое число 0 не является допустимым представлением для NULL.Я бы попробовал None или, может быть, c_void_p(None).(Однако не уверен, как это может иметь значение в этом контексте.)

[обновление 2]

Очевидно, reboot(0x1234567) добивается цели (см. Комментарии).

2 голосов
/ 01 июня 2011

reboot() в libc - это оболочка для системного вызова, которая принимает только аргумент cmd. Так что попробуйте:

libc.reboot(0x1234567)

Обратите внимание, что обычно вы должны инициировать перезагрузку, отправив SIGINT на PID 1 - указание ядру на перезагрузку не даст системным демонам возможности завершить работу полностью и даже не синхронизирует кэш файловой системы с диском. .

...