簡體   English   中英

從C程序關閉Linux意味着作為init進程運行

[英]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啟動。在許多系統上, initsystemd程序的符號鏈接; 類似地,在這些系統上, 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);

也可以看看

如何從C ++程序中重啟Linux?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM