reboot(2) перезагружает систему и разрешает/запрещает использование

ОБЗОР

/* Библиотечная функция в 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 и в большинстве альтернативных libc (включая uclibc,
   deitlibc, musl и других) некоторым константам присвоены
   символьные имена 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). Это означает, что нажатие комбинации клавиш 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; начиная с Linux 1.1.76) Выводится сообщение «System halted.» и система останавливается. Управление передается монитору в ПЗУ, если таковой имеется. Если вызову этой функции не предшествует sync(2), то данные будут потеряны.
LINUX_REBOOT_CMD_KEXEC
(RB_KEXEC, 0x45584543, начиная с Linux 2.6.13) Выполняет ядро, которое было загружено ранее с помощью kexec_load(2). Этот параметр доступен только, если ядро собрано с параметром CONFIG_KEXEC.
LINUX_REBOOT_CMD_POWER_OFF
(RB_POWER_OFF, 0x4321fedc; начиная с Linux 2.1.30) Выводится сообщение «Power down.», система останавливается, и у системы отключаются все источники питания, если это возможно. Если вызову этой функции не предшествует sync(2), то данные будут потеряны.
LINUX_REBOOT_CMD_RESTART
(RB_AUTOBOOT, 0x1234567) Выводится сообщение «Restarting system.», и по умолчанию сразу выполняется перезагрузка системы. Если вызову этой функции не предшествует команда sync(2), то данные будут потеряны.
LINUX_REBOOT_CMD_RESTART2
(0xa1b2c3d4; начиная с Linux 2.1.30) Выводится сообщение «Restarting system with command '%s'» и немедленно выполняется перезагрузка системы (с использованием командной строки, заданной в arg). Если вызову этой функции не предшествует sync(2), то данные будут потеряны.
LINUX_REBOOT_CMD_SW_SUSPEND
(RB_SW_SUSPEND, 0xd000fce1; начиная с Linux 2.5.18) Система переводится в режим ожидания (suspended, hibernated) на диск. Этот параметр доступен только, если ядро собрано с параметром CONFIG_HIBERNATION.

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

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

Поведение внутри пространств имён PID

Начиная с Linux 3.4, если reboot() вызывается из пространства имён PID (смотрите pid_namespaces(7)) отличающегося от начального пространства имён PID, то вызов посылает сигнал в пространство имён процесса «init». При LINUX_REBOOT_CMD_RESTART и LINUX_REBOOT_CMD_RESTART2 посылается сигнал SIGHUP. При LINUX_REBOOT_CMD_POWER_OFF и LINUX_REBOOT_CMD_HALT посылается сигнал SIGINT.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При значениях cmd, по которым система останавливается или перезагружается, в случае успешной работы reboot() ничего не возвращается. При других значений cmd в случае успешной работы возвращается ноль. При ошибке всегда возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EFAULT
Проблема получения данных пользовательского пространства при LINUX_REBOOT_CMD_RESTART2.
EINVAL
Неправильные идентификационные числа или cmd.
EPERM
У вызывающего процесса недостаточно прав для вызова reboot(); требуется мандат CAP_SYS_BOOT.

СООТВЕТСТВИЕ СТАНДАРТАМ

Вызов reboot() есть только в Linux, и он не должен использоваться в переносимых программах.