2017年2月24日 星期五

Busybox的halt, poweroff, reboot指令,以及driver內可以作這些動作的signal

指令 halt、poweroff、跟 reboot 的動作過程類似,都是 kill pid=1 的行程,一般是 init,pid=1 的行程會去執行 inittab 的 shutdown 動作後,呼叫函式庫函式 reboot()。reboot() 再執行系統呼叫進到 kernel 執行 sys_reboot() ,去做相關動作。

Signal的表格如下所示:


signal to kill initreboot() 參數kernel動作
haltSIGUSR1RB_HALT_SYSTEM (0xcdef0123)kernel_halt()停止所有程式
poweroffSIGUSR2RB_POWER_OFF (0x4321fedc)kernel_power_off()停止所有程式後關電 (關電未必有實作)
rebootSIGTERMRB_AUTOBOOT (0x01234567)kernel_restart()停止所有程式後再開機


與busybox的道理相同,假設我在driver內寫一個 kill_cad_pid(SIGTERM, 1);
接下來就會執行reboot()的動作

假設我是寫 kill_cad_pid(SIGUSR2, 1);
則接下來會進入poweroff的狀態

給不同的Signal會有不同的結果!



如果下這三個busybox指令的其中一個,再加上 -f 參數的話,就直接執行 reboot(),不做 inittab 的 shutdown 動作。

沒有留言:

張貼留言