从 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 启动。在许多系统上,init
是 systemd
程序的符号 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?
我正在编写一个 C 程序来在 Linux 系统上执行各种操作,然后将其关闭。该程序将使用 PID 为 1 的命令行选项 init=/path/to/program
启动,因此,我不能使用 execl("/sbin/poweroff", "poweroff", NULL);
,因为 poweroff
命令不会关闭系统本身,它要求 PID 为 1 的进程执行此操作。那么init
用什么代码来关闭系统呢?
为什么 poweroff
不起作用?
许多程序假定内核已使用 init
作为 PID 1 启动。在许多系统上,init
是 systemd
程序的符号 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?