REBOOT(2)

ИМЯ
reboot - перезагружает систему и разрешает/запрещает использование комбинации Ctrl-Alt-Del

ОБЗОР
/* Библиотечная функция в libc4, libc5 и системный вызов
   одинаковы, и начиная с версии ядра 2.1.30 появились
   символьные имена LINUX_REBOOT_* для констант и четвёртый
   аргумент вызова */

#include <unistd.h>
#include <linux/reboot.h>

int reboot(int magic, int magic2, int cmd, void *arg);

/* В glibc некоторым константам присвоены символьные имена
   RB_*, а библиотечная функция является обёрткой с одним
   аргументом вокруг системного вызова с тремя аргументами */

#include <unistd.h>
#include <sys/reboot.h>

int reboot(int cmd);

ОПИСАНИЕ
Вызов reboot() перезагружает систему или разрешает/запрещает использование для перезагрузки специального сочетания клавиш (сокращённо CAD, от комбинации по умолчанию — Ctrl-Alt-Delete; может быть изменена с помощью loadkeys(1)).

Данный системный вызов завершается с ошибкой (EINVAL), если magic не равен LINUX_REBOOT_MAGIC1 (0xfee1dead) и magic2 не равен LINUX_REBOOT_MAGIC2 (672274793). Однако, начиная с 2.1.17 в magic2 также можно использовать LINUX_REBOOT_MAGIC2A (85072278) и начиная с 2.1.97 — LINUX_REBOOT_MAGIC2B (369367448) и начиная с 2.5.71 — LINUX_REBOOT_MAGIC2C (537993216) (шестнадцатеричные значения этих констант говорят сами за себя). Аргумент cmd может принимать следующие значения:

LINUX_REBOOT_CMD_CAD_OFF
    (RB_DISABLE_CAD, 0). Запретить использование сочетания клавиш для перезагрузки системы. Это означает, что нажатие комбинации клавиш CAD приведёт к тому, что процессу init (с идентификатором 1) будет послан сигнал SIGINT, после чего этот процесс может сам решить какие действия выполнять (возможно, послать сигналы процессам, выполнить команду sync, reboot).

LINUX_REBOOT_CMD_CAD_ON
    (RB_ENABLE_CAD, 0x89abcdef). Разрешить использование сочетания клавиш для перезагрузки (CAD). Это означает, что нажатие комбинации клавиш CAD приведёт к немедленному выполнению действия, связанного с LINUX_REBOOT_CMD_RESTART.

LINUX_REBOOT_CMD_HALT
    (RB_HALT_SYSTEM, 0xcdef0123; начиная с 1.1.76). Выводится сообщение «System halted.» и система останавливается. Управление передается монитору в ПЗУ, если таковой имеется. Если вызову этой функции не предшествует sync(2), то данные будут потеряны.

LINUX_REBOOT_CMD_KEXEC (начиная с Linux 2.6.13)
    Выполняет ядро, которое было загружено ранее с помощью kexec_load(2). Этот параметр доступен только если ядро собрано с параметром CONFIG_KEXEC.

LINUX_REBOOT_CMD_POWER_OFF
    (0x4321fedc; начиная с 2.1.30). Выводится сообщение «Power down.», система останавливается, и у системы отключаются все источники питания, если это возможно. Если вызову этой функции не предшествует sync(2), то данные будут потеряны.

LINUX_REBOOT_CMD_RESTART
    (RB_AUTOBOOT, 0x1234567). Выводится сообщение "Restarting system.", и по умолчанию сразу выполняется перезагрузка системы. Если вызову этой функции не предшествует команда sync(2), то данные будут потеряны.

LINUX_REBOOT_CMD_RESTART2
    (0xa1b2c3d4; начиная с 2.1.30). Выводится сообщение "Restarting system with command '%s'" и немедленно выполняется перезагрузка системы (с использованием командной строки, заданной в arg). Если вызову этой функции не предшествует sync(2), то данные будут потеряны.

Только суперпользователь может вызывать reboot().

Конкретное действие описанных выше команд зависит от архитектуры системы. Что касается i386, то дополнительный аргумент в данное время ничего не даёт (2.1.122), а тип перезагрузки можно задать в командной строке ядра ("reboot=..."), определив, будет ли перезагрузка "тёплой" или "холодной", а также аппаратной или посредством BIOS.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При значениях cmd, по которым система останавливается или перезагружается, в случае успешной работы reboot() ничего не возвращается. При других значений cmd в случае успешной работы возвращается ноль. При ошибке всегда возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EFAULT
    Проблема получения данных пользовательского пространства при LINUX_REBOOT_CMD_RESTART2.

EINVAL
    Неправильные идентификационные числа или cmd.

EPERM
    У вызывающего процесса недостаточно прав для вызова reboot(); требуется мандат CAP_SYS_BOOT.

СООТВЕТСТВИЕ СТАНДАРТАМ
Вызов reboot() есть только в Linux, и он не должен использоваться в переносимых программах.

СМОТРИТЕ ТАКЖЕ
sync(2), bootparam(7), capabilities(7), ctrlaltdel(8), halt(8), reboot(8)