从 C 程序关闭 Linux 意味着 运行 作为初始化进程

Shutdown Linux from C program meant to be ran as init process

我正在编写一个 C 程序来在 Linux 系统上执行各种操作,然后将其关闭。该程序将使用 PID 为 1 的命令行选项 init=/path/to/program 启动,因此,我不能使用 execl("/sbin/poweroff", "poweroff", NULL);,因为 poweroff 命令不会关闭系统本身,它要求 PID 为 1 的进程执行此操作。那么init用什么代码来关闭系统呢?

为什么 poweroff 不起作用?

许多程序假定内核已使用 init 作为 PID 1 启动。在许多系统上,initsystemd 程序的符号 link;类似地,在这些系统上,poweroff 通常是 systemctl 程序的符号 link。

在您的设置中,systemd 从未启动,因为您设置了自定义 init=/path/to/program 内核参数行。这就是 poweroff 命令不起作用的原因:systemctl 正在尝试联系从未创建的 systemd 实例。

如何在没有systemd的情况下关机。

reboot 函数在 Linux Programmer's Manual 中有描述。在glibc下,可以通过RB_POWER_OFF宏常量来执行重启。

请注意,如果 reboot 之前没有调用 sync,数据可能会丢失。

Linux中使用glibc

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

sync();
reboot(RB_POWER_OFF);

另见

How to restart Linux from inside a C++ program?