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.下面的设计公司的东东,不贴拉 呵呵。

相关内容

    暂无相关文章