日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c代码触发sysrq-trigger

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 1

kernel針對sysrq的說明文檔
但注意不是網站說明的所有sysrq命令都是在系統中有實現的,可能與內核配置或者版本相關,可以通過如下命令查看支持的 sysrq命令。以我個人的樹莓派為例

echo h > /proc/sysrq-trigger [4802093.110500] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) dump-ftrace-buffer(z)
  • 觸發調試類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的功能。該流程經歷了以下幾個環節的探索。

  • 使用strace命令跟蹤 echo 調用,實際發現只能跟蹤到echo調用本身,會把特定命令寫入到其標準輸出。但是沒有其具體如何寫入/proc/sysrq-trigger的流程。才想起實際是管道最終實現的寫入/proc/sysrq-trigger的流程。故而想到對bash或者shell進行跟蹤。
  • 在一個終端上登錄后,同時通過ssh再登錄終端。得到前后兩個終端的bash
  • ps aux | grep bash pi 17434 0.0 0.4 6464 4652 pts/0 Ss 10:52 0:00 -bash pi 17542 0.0 0.5 6456 4776 pts/1 Ss 10:59 0:00 -bash

    在第二個終端中對第一個終端的bash進程調用strace
    在第一個終端中執行echo “?” > /proc/sysrq-trigger 命令。
    得到如下一段sysrq打印的結果。故而得到使用c代碼觸發sysrq-trigger的方式。

    ... gettimeofday({1652497235, 924706}, NULL) = 0 open("/proc/sysrq-trigger", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 fcntl64(1, F_GETFD) = 0 fcntl64(1, F_DUPFD, 10) = 10 fcntl64(1, F_GETFD) = 0 fcntl64(10, F_SETFD, FD_CLOEXEC) = 0 dup2(3, 1) = 1 ...

    同時該手段也提供了后續跟蹤shell執行命令的一個思路。

    總結

    以上是生活随笔為你收集整理的c代码触发sysrq-trigger的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。