В man bash, в разделе SHELL BUILTIN COMMANDS (в разделе set) сказано: "Примечание: [1121227]()[1121228] синтаксис порождает подоболочку, если вам не нравится форкинг, просто используйте более подробный вариант
Реальный код ядра зависит от архива вашей системы. Для x86 систем они расположены в arch/x86/kernel/reboot.c
Halt остановит машину и оставит её включённой. Таким образом, она просто останавливает ядро, но обычно не выключает его.
static void native_machine_halt(void)
{
/* Stop other cpus and apics */
machine_shutdown();
tboot_shutdown(TB_SHUTDOWN_HALT);
stop_this_cpu(NULL);
}
Хотя power_off также отключает электрический источник из APM / ACPI pm_power_off()
static void native_machine_power_off(void)
{
if (pm_power_off) {
if (!reboot_force)
machine_shutdown();
pm_power_off();
}
/* A fallback in case there is no PM info available */
tboot_shutdown(TB_SHUTDOWN_HALT);
}
machine_shutdown() - это бесконечный цикл
tboot_shutdown() (arch/x86/kernel/tboot. c)
stop_this_cpu(NULL) (arch/x86/kernel/process.c) отключает IRQ процессора, переводит процессор в автономный режим,
pm_power_off() (arch/x86/kernel/apm_32.c) является указателем на функцию apm_power_off()
Как видите, все задания зависят от архива. Во всех случаях она выполняется вызовами ASM.
Для apm_power_off() вызывается Bios с кодом APT_STATE_OFF (0x0003).
apm_bios_call_simple(APM_FUNC_SET_STATE, APM_DEVICE_ALL, APM_STATE_OFF, eax, err);
Для native_halt() (arch/x86/include/asm/irqflags.h) используются эти вызовы :
asm volatile("hlt": : :"memory");
Choose your poison :)
.Традиционно программное обеспечение может контролировать уровень мощности, передавая команды на оболочку или подставку. Вы должны быть придным пользователям при использовании этого подхода и дайте им время для правильной реагирования. В зависимости от вашей системы init, вы передаете систему INIT на уровень. Ниже приведена таблица уровней
+-------------------+-------------------------------------------------------+----------------------------------------------------------------------------------------------+ | Sysvinit Runlevel | Systemd Target | Notes | +-------------------+-------------------------------------------------------+----------------------------------------------------------------------------------------------+ | 0 | runlevel0.target, poweroff.target | Halt the system. | | 1, s, single | runlevel1.target, rescue.target | Single user mode. | | 2, 4 | runlevel2.target, runlevel4.target, multi-user.target | User-defined/Site-specific runlevels. By default, identical to 3. | | 3 | runlevel3.target, multi-user.target | Multi-user, non-graphical. Users can usually login via multiple consoles or via the network. | | 5 | runlevel5.target, graphical.target | Multi-user, graphical. Usually has all the services of runlevel 3 plus a graphical login. | | 6 | runlevel6.target, reboot.target | Reboot | | emergency | emergency.target | Emergency shell | +-------------------+-------------------------------------------------------+----------------------------------------------------------------------------------------------+
Причина, по которой я говорю, чтобы быть хорошим, это потому, что вы не можете сделать это без предупреждения. Если пользователь работает над многопользовательской системой, и другой пользователь с надлежащими разрешениями использует ваше программное обеспечение, рабочая работа пользователя будет вынуждена от системы (и, следовательно, потерять всю работу), пока она не перезагружается и т. Д.
, как Goldilocks Государства, это самый близкий, который вы получите метод пользователя. Весь другой код хранится в ядре, который я не могу найти в данный момент, но вот документ , связанный с управлением питанием водителя , в архиве Arnux Archive