zoukankan      html  css  js  c++  java
  • OK335xS psplash 进度条工作原理 hacking

    #!/bin/sh
    #
    # rc     This file is responsible for starting/stopping
    #        services when the runlevel changes.
    #
    #        Optimization feature:
    #        A startup script is _not_ run when the service was
    #        running in the previous runlevel and it wasn't stopped
    #        in the runlevel transition (most Debian services don't
    #        have K?? links in rc{1,2,3,4,5} )
    #
    # Author:    Miquel van Smoorenburg <miquels@cistron.nl>
    #        Bruce Perens <Bruce@Pixar.com>
    #
    # Version:    @(#)rc  2.78  07-Nov-1999  miquels@cistron.nl
    #
    
    # 一. 参考文档:
    #     1. inittab脚本启动解析 
    #         http://blog.chinaunix.net/uid-17188120-id-4073497.html
    #     2. Customizing the SDK Splash Screen
    #         http://processors.wiki.ti.com/index.php/Customizing_the_SDK_Splash_Screen
    #     3. psplash进度条旋转成功
    #         http://www.xuebuyuan.com/1511619.html
    #
    #                                    2016-1-9 深圳 南山平山村 曾剑锋 
    
    ##
    ##
    ## /etc/default/rcS
    ##
    ## Default settings for the scripts in /etc/rcS.d/
    ##
    ## For information about these variables see the rcS(5) manual page.
    ##
    ## This file belongs to the "initscripts" package.
    #
    ## delete files in /tmp during boot older than x days.
    ## '0' means always, -1 or 'infinite' disables the feature
    #TMPTIME=0
    #
    ## spawn sulogin during boot, continue normal boot if not used in 30 seconds
    #SULOGIN=no
    #
    ## do not allow users to log in until the boot has completed
    #DELAYLOGIN=no
    #
    ## assume that the BIOS clock is set to UTC time (recommended)
    #UTC=yes
    #
    ## be more verbose during the boot process
    #VERBOSE=no
    #
    ## automatically repair filesystems with inconsistencies during boot
    #FSCKFIX=no
    . /etc/default/rcS
    export VERBOSE
    
    # 在rcS中设置的一些环境变量
    # PATH=/sbin:/bin:/usr/sbin:/usr/bin
    # runlevel=S
    # prevlevel=N
    # umask 022
    # export PATH runlevel prevlevel
    # 
    # exec /etc/init.d/rc S
    
    # 这个函数名可以认为是重置进度条进度
    startup_progress() {
        # 当前进度大小=上一次的进度+上每次的进度的变化值
        step=$(($step + $step_change))
        if [ "$num_steps" != "0" ]; then
            # 这里相当于重新计算当前step占进度条的百分比
            progress=$((($step * $progress_size / $num_steps) + $first_step))
        else
            # 直接就是100%了
            progress=$progress_size
        fi
        #echo "PROGRESS is $progress $runlevel $first_step + ($step of $num_steps) $step_change $progress_size"
        #if type psplash-write >/dev/null 2>&1; then
        #    TMPDIR=/mnt/.psplash psplash-write "PROGRESS $progress" || true
        #fi
        # 将上面的progress的值写入fifo中去,echo的值是固定的。
        if [ -e /mnt/.psplash/psplash_fifo ]; then
            echo "PROGRESS $progress" > /mnt/.psplash/psplash_fifo
        fi
    }
    
    
    #
    # Start script or program.
    #
    # 启动脚本函数
    startup() {
        # Handle verbosity 
        # VERBOSE=no, 不显示这一部分内容
        [ "$VERBOSE" = very ] && echo "INIT: Running $@..."
    
        case "$1" in
            *.sh)
                # Source shell script for speed.
                # 这里相当于直接执行脚本,丢弃了参数
                (
                    trap - INT QUIT TSTP
                    scriptname=$1
                    shift
                    . $scriptname
                )
                ;;
            *)
                # 执行参数里命令
                "$@"
                ;;
        esac
        startup_progress
    }
    
    # Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
    # 这里就是捕捉INT QUIT TSTP三个信号,执行“:”,实际就是忽略这三个信号,防止脚本执行时使用ctrl-C 就退出脚本
    trap ":" INT QUIT TSTP
    
    # Set onlcr to avoid staircase effect.
    # 设置onlcr避免楼梯的效果。
    stty onlcr 0>&1
    
    # Now find out what the current and what the previous runlevel are.
    
    runlevel=$RUNLEVEL
    #echo "danny add"
    echo  $2
    sleep 5
    # Get first argument. Set new runlevel to this argument.
    # 由于传进来的参数的$1=S,所以这里可以断定的是runlevel是S
    [ "$1" != "" ] && runlevel=$1
    if [ "$runlevel" = "" ]
    then
        echo "Usage: $0 <runlevel>" >&2
        exit 1
    fi
    # 目前没有看到由有关PREVLEVEL相关的内容,这里previous是N
    previous=$PREVLEVEL
    [ "$previous" = "" ] && previous=N
    
    export runlevel previous
    
    # Is there an rc directory for this new runlevel?
    if [ -d /etc/rc$runlevel.d ]
    then
        # Find out where in the progress bar the initramfs got to.
        PROGRESS_STATE=0
        #if [ -f /dev/.initramfs/progress_state ]; then
        #    . /dev/.initramfs/progress_state
        #fi
    
        # Split the remaining portion of the progress bar into thirds
        # 感觉这里可以认为是:已经出了一部分的脚本了,这部分内容也应该算进去
        # 所以给出一部分进度条的空间出来,这样,进度条就不像是从0开始,至少
        # 当我们看到图像的时候,psplash这个进程已经跑起来了。
        progress_size=$(((100 - $PROGRESS_STATE) / 3))
    
        # 这里的runlevel是S
        case "$runlevel" in
            0|6)
                # Count down from -100 to 0 and use the entire bar
                first_step=-100
                progress_size=100
                step_change=1
                ;;
            S)
                # Begin where the initramfs left off and use 2/3
                # of the remaining space
                first_step=$PROGRESS_STATE
                progress_size=$(($progress_size * 2))  # 剩下2/3
                step_change=1
                ;;
            *)
                # Begin where rcS left off and use the final 1/3 of
                # the space (by leaving progress_size unchanged)
                first_step=$(($progress_size * 2 + $PROGRESS_STATE))
                step_change=1
                ;;
        esac
    
        num_steps=0
        for s in /etc/rc$runlevel.d/[SK]*; do
            case "${s##/etc/rc$runlevel.d/S??}" in
                gdm|xdm|kdm|reboot|halt)
                    break
                    ;;
            esac
            num_steps=$(($num_steps + 1))
        done
        step=0
    
        # First, run the KILL scripts.
        # 先结束掉需要结束的进程
        if [ $previous != N ]
        then
            for i in /etc/rc$runlevel.d/K[0-9][0-9]*
            do
                # Check if the script is there.
                [ ! -f $i ] && continue
    
                # Stop the service.
                startup $i stop
            done
        fi
    
        # Now run the START scripts for this runlevel.
        for i in /etc/rc$runlevel.d/S*
        do
            [ ! -f $i ] && continue
    
            # 这里的previous=N,可以不用关心
            if [ $previous != N ] && [ $previous != S ]
            then
                #
                # Find start script in previous runlevel and
                # stop script in this runlevel.
                #
                suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
                stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
                previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
                #
                # If there is a start script in the previous level
                # and _no_ stop script in this level, we don't
                # have to re-start the service.
                #
                [ -f $previous_start ] && [ ! -f $stop ] && continue
            fi
            case "$runlevel" in
                0|6)
                    startup $i stop
                    ;;
                *)
                    startup $i start
                    ;;
            esac
        done
    fi
    
    #Uncomment to cause psplash to exit manually, otherwise it exits when it sees a VC switch
    if [ "x$runlevel" != "xS" ] && [ ! -x /etc/init.d/xserver-nodm ]; then
        . /etc/init.d/qt.sh
    #    if type psplash-write >/dev/null 2>&1; then
    #        TMPDIR=/mnt/.psplash psplash-write "QUIT" || true
    #        umount /mnt/.psplash
    #    fi
    fi
  • 相关阅读:
    允许debian wheezy支持IOS7+的iphone.
    openSUSE 国内镜像摘要
    策略模式总结
    顺序串
    WindowState注意事项
    NLP | 自然语言处理
    Using Autorelease Pool Blocks
    NSAutoreleasePool & thread
    oc语言特性
    oc语言基础整理
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/5116713.html
Copyright © 2011-2022 走看看