首页 / 操作系统 / Linux / linux pm-suspend过程之我见
pm-suspend 正常流程:f 7 1.pm-suspend-->symbol link to /usr/lib/pm-utils/bin/pm-action 2.pm-action通过处理提取出命令的suspend字段放在 ACTION变量中 用suspend 为参数调用 /usr/lib/pm-utils/functions中的 pm_main 3.pm_main pm_main() { if [ -n "$PM_LOGFILE" ]; then exec > "$PM_LOGFILE" 2>&1 ##如果/var/log/pm-suspend.log存在,将所有echo输出重定向到该文件中 fi take_suspend_lock || exit 1 rm -f "$INHIBIT" run_hooks "$1" ##以 suspend为参数调用run_hook 函数 ##最终调用 do_suspend做真正的休眠 if [ ! -e "$INHIBIT" -a "$(type -t "do_$1")" == "function" ]; then sync ; sync ; sync "do_$1" fi run_hooks "$2" reverse ##调用 run_hooks resume reverse remove_suspend_lock 200 return 0 } take_suspend_lock() { VT=$(fgconsole) ##取forward ground console值,VT=7 chvt 63 ##切换到VT 63 if [ -f /.suspended ]; then ##如果/ 下存在.suspend文件,则从该文件中读取pid值 read pid < /.suspended if [ -d /proc/$pid ]; then ##若/proc下存在相应的入口,函数退出,回到pm_main中,pm-suspend命令也就退出。 return 1 fi fi ##以上其实是测试用户是否已经运行过一个pm-suspend命令,系统不会连续运行pm-suspend echo "$$" > /.suspended ##打印自己的pid到/.suspend文件 rm -f /var/run/pm-suspend touch /var/run/pm-suspend return 0 } remove_suspend_lock() { rm -f /var/run/pm-suspend chvt 1 ##切换到VT1 chvt $VT ##切换到休眠前的VT openvt -- sh -c "usleep $1 ; rm -f /.suspended >/dev/null 2>&1 0<&1" >/dev/null 2>&1 0<&1 & ##打开VT(也就是VT7) , #执行sh :睡200秒,删掉/.suspend文件 } 4.run_hooks函数主要做的事情就是把/usr/lib/pm-utils/hooks 下的脚本统统执行一遍 hooks目录下的脚本命名方式是: 数字+要hook的名字 suspend 时,数字小的脚本先执行,resume时,执行相反的顺序,这样保证suspend-resume有正确的顺序。 5.下面的设计公司的东东,不贴拉 呵呵。
收藏该网址