从作为init进程运行的C程序关闭Linux

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

6

为什么 poweroff 命令无法正常工作?

许多程序都假定内核已经将 PID 1 设置为 init。 在许多系统上,init 是一个指向 systemd 程序的符号链接; 同样,在这些系统上,poweroff 经常是指向 systemctl 程序的符号链接。

在你的设置中,由于你设置了自定义的 init=/path/to/program 内核参数行,因此从未启动过 systemd。 这就是为什么 poweroff 命令无法正常工作的原因: systemctl 尝试连接一个从未创建的 systemd 实例。

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

reboot 函数在 Linux 程序员手册 中有描述。 在 glibc 下,您可以传递 RB_POWER_OFF 宏常量以执行重启。

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

在 Linux 中使用 glibc

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

sync();
reboot(RB_POWER_OFF);

参见

如何在C++程序内部重新启动Linux?


3
建议:还需要注意的是,init 还负责其他预重启任务,例如停止守护进程、卸载(或至少将所有文件系统重新挂载为只读)、关闭 LVM/RAID 等等。 - derobert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接