linux pm-suspend过程彻底研究

上一篇 / 下一篇  2008-04-10 21:18:35 / 个人分类:Linux

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有正确的顺序。

TAG: Linux

 

评分:0

我来说两句

Open Toolbar