[英]Shutdown Linux from C program meant to be ran as init process
我正在編寫一個C程序來在Linux系統上執行各種操作,然后將其關閉。 這個程序將使用命令行選項init=/path/to/program
with PID 1啟動,因此,我不能使用execl("/sbin/poweroff", "poweroff", NULL);
,因為poweroff
命令不會關閉系統本身,它會通過PID 1請求進程執行此操作。 那么init
使用什么代碼來關閉系統呢?
poweroff
工作? 許多程序假設內核已使用init
作為PID 1啟動。在許多系統上, init
是systemd
程序的符號鏈接; 類似地,在這些系統上, poweroff
通常是systemctl
程序的符號鏈接。
在您的設置中,自從您設置自定義init=/path/to/program
內核參數行以來, systemd
永遠不會啟動。 這就是poweroff
命令不起作用的原因: systemctl
正在嘗試聯系從未創建過的systemd
實例。
systemd
情況下關閉電源。 Linux程序員手冊中描述了reboot
功能。 在glibc下 ,您可以傳遞RB_POWER_OFF
宏常量來執行重新啟動。
請注意,如果reboot
之前沒有調用sync
,則數據可能會丟失。
在Linux中使用glibc :
#include <unistd.h>
#include <sys/reboot.h>
sync();
reboot(RB_POWER_OFF);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.