c代码触发sysrq-trigger
通過c代碼觸發sysrq-trigger
日常使用sysrq-trigger基本有兩種場景,在有終端鍵盤的情況下 Alt+SysRq+“?” 特定字母的組合鍵觸發sysrq的功能。如果有root權限,則會使用如下命令行的形式來觸發
echo "?" > /proc/sysrq-trigger那么如何在c代碼中直接觸發sysrq-trigger呢?。可以使用如下的方式
int fd = open("/proc/sysrq-trigger", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666);write(fd,"m\n",2);close(fd);/proc/sysrq-trigger 常用功能
首先需要在proc中確認sysrq是否啟用
# cat /proc/sys/kernel/sysrq 1kernel針對sysrq的說明文檔
但注意不是網站說明的所有sysrq命令都是在系統中有實現的,可能與內核配置或者版本相關,可以通過如下命令查看支持的 sysrq命令。以我個人的樹莓派為例
-
觸發調試類sysrq命令
- b Will immediately reboot the system without syncing or unmounting your disks. [立即重啟系統]
- c Will perform a system crash and a crashdump will be taken if configured. [觸發一次系統崩潰]
- e Send a SIGTERM to all processes, except for init.[向init進程以外的所有進程發送SIGTERM信號]
- f Will call the oom killer to kill a memory hog process, but do not panic if nothing can be killed. [觸發一次內核的oom killer]
- i Send a SIGKILL to all processes, except for init. [向init進程以外的所有進程發送SIGKILL信號]
- j Forcibly “Just thaw it” - filesystems frozen by the FIFREEZE ioctl. [凍結文件系統?沒有嘗試過]
- n Used to make RT tasks nice-able
- o Will shut your system off (if configured and supported). [關機]
- s Will attempt to sync all mounted filesystems.[同步文件系統]
- u Will attempt to remount all mounted filesystems read-only.[重新掛載所有文件系統為只讀]
-
信息查看類sysrq命令
- l Shows a stack backtrace for all active CPUs. [打印所有cpu的當前調用棧]
- m Will dump current memory info to your console.[打印所有內存信息到控制臺]
- p Will dump the current registers and flags to your console. [打印寄存器信息和標記到控制臺]
- q Will dump per CPU lists of all armed hrtimers [打印所有計時器]
- t Will dump a list of current tasks and their information to your console. [打印任務狀態和信息到控制臺]
- w Dumps tasks that are in uninterruptable (blocked) state.[打印當前處于阻塞狀態的任務]
了解 echo “?” > /proc/sysrq-trigger的實現
需要通過c代碼觸發sysrq-trigger的初衷是希望在代碼中感知到內存不足的場景下,在內核之前觸發oom,同時為了避免某些場景下內核沒有及時觸發oom,導致系統無法正常工作的情況。但是因為內存已經是臨界狀態,通過system調用echo命令也有極大可能失敗,因為fork進程需要占據比較大的內存空間,故而希望能夠直接在代碼中實現 echo “?” > /proc/sysrq-trigger的功能。該流程經歷了以下幾個環節的探索。
在第二個終端中對第一個終端的bash進程調用strace
在第一個終端中執行echo “?” > /proc/sysrq-trigger 命令。
得到如下一段sysrq打印的結果。故而得到使用c代碼觸發sysrq-trigger的方式。
同時該手段也提供了后續跟蹤shell執行命令的一個思路。
總結
以上是生活随笔為你收集整理的c代码触发sysrq-trigger的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强网杯-crypto modestudy
- 下一篇: 浅析迭代器失效