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