#!/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{,,,,} )
#
# Author: Miquel van Smoorenburg <miquels@cistron.nl>
# Bruce Perens <Bruce@Pixar.com>
#
# Version: @(#)rc 2.78 -Nov- miquels@cistron.nl
# # 一. 参考文档:
# . inittab脚本启动解析
# http://blog.chinaunix.net/uid-17188120-id-4073497.html
# . Customizing the SDK Splash Screen
# http://processors.wiki.ti.com/index.php/Customizing_the_SDK_Splash_Screen
# . psplash进度条旋转成功
# http://www.xuebuyuan.com/1511619.html
#
# -- 深圳 南山平山村 曾剑锋 ##
##
## /etc/default/rcS
##
## Default settings for the scripts in /etc/rcS.d/
##
## For information about these variables see the rcS() manual page.
##
## This file belongs to the "initscripts" package.
#
## delete files in /tmp during boot older than x days.
## '' means always, - or 'infinite' disables the feature
#TMPTIME=
#
## spawn sulogin during boot, continue normal boot if not used in 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
# export PATH runlevel prevlevel
#
# exec /etc/init.d/rc S # 这个函数名可以认为是重置进度条进度
startup_progress() {
# 当前进度大小=上一次的进度+上每次的进度的变化值
step=$(($step + $step_change))
if [ "$num_steps" != "" ]; 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=$
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 >& # Now find out what the current and what the previous runlevel are. runlevel=$RUNLEVEL
#echo "danny add"
echo $
sleep
# Get first argument. Set new runlevel to this argument.
# 由于传进来的参数的$=S,所以这里可以断定的是runlevel是S
[ "$1" != "" ] && runlevel=$
if [ "$runlevel" = "" ]
then
echo "Usage: $0 <runlevel>" >&
exit
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=
#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=$((( - $PROGRESS_STATE) / )) # 这里的runlevel是S
case "$runlevel" in
|)
# Count down from - to and use the entire bar
first_step=-
progress_size=
step_change=
;;
S)
# Begin where the initramfs left off and use /
# of the remaining space
first_step=$PROGRESS_STATE
progress_size=$(($progress_size * )) # 剩下2/
step_change=
;;
*)
# Begin where rcS left off and use the final / of
# the space (by leaving progress_size unchanged)
first_step=$(($progress_size * + $PROGRESS_STATE))
step_change=
;;
esac num_steps=
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 + ))
done
step= # First, run the KILL scripts.
# 先结束掉需要结束的进程
if [ $previous != N ]
then
for i in /etc/rc$runlevel.d/K[-][-]*
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[-][-]}
stop=/etc/rc$runlevel.d/K[-][-]$suffix
previous_start=/etc/rc$previous.d/S[-][-]$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
|)
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 >&; then
# TMPDIR=/mnt/.psplash psplash-write "QUIT" || true
# umount /mnt/.psplash
# fi
fi

OK335xS psplash 进度条工作原理 hacking的更多相关文章

  1. ajax ----进度条的原理

    一.进度条的原理 新知识点:Html5中FormData,xmlHttpRequest中的upload属性,progress事件监控 xmlHttpRequest中的upload属性,实现: < ...

  2. HTML5-svg圆形饼状图进度条实现原理

    <svg width="440" height="440" viewbox="0 0 440 440"> <circle ...

  3. php实现进度条原理

    PHP实现进度条的原理: 模版替换,在页面设置一个标识,轮子自己的页面,不发请求给服务器,由服务器端获得进度,然后替换该页面标识,达到进度条效果. 页面代码: 1 2 3 4 5 6 7 8 9 10 ...

  4. PHP上传实现进度条

    Web上传文件的三种解决方案

  5. ASP.NET技巧:教你制做Web实时进度条

    网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了 一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一 ...

  6. 详解Bootstrap进度条组件

    在网页中,进度条的效果并不少见,如:平分系统.加载状态等,进度条组件使用了css3的transition和animation属性来完成一些特效,这些特效在IE9及IE9以下版本.Firefox的老版本 ...

  7. iOS 开发技巧-制作环形进度条

    有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现. 先看一下这篇博客,博客地址:ht ...

  8. iOS一分钟学会环形进度条

    有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现.先看一下这篇博客,博客地址:htt ...

  9. 制作进度条(UISlider)

    怎样判断是否应当使用进度条 用进度条的主要目的是为了用一根管子的充满程度来直观地表示某种数值的百分比,进度条分为可拖动和不可拖动两种. 可拖动进度条和不可拖动进度条的原理几乎是一模一样,唯一的区别是可 ...

随机推荐

  1. python 安装 easy_intall 和 pip python无root权限安装

    http://www.cnblogs.com/haython/p/3970426.html easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安装e ...

  2. Unix守护进程

    问题描述:         Unix守护进程 问题解决:     Unix守护进程没有控制终端,终端名设置为问号(?),终端前台进程组ID设置(TPGID)为-1 守护进程编写规则:      (1) ...

  3. 循环队列实现(C++) Ring Buffer

    循环队列:队列有着先入先出的特性.但是对于队列如果删除队头以后剩下的空间将不会被释放,又由于队列只能由队尾插入这就导致被删除部分的空间被浪费.解决这个问题就是循环队列.循环队列顾名思义就是将队列串起来 ...

  4. 基于EBP的栈帧

    程序的OEP,一开始以 push ebp 和mov ebp esp这两句开始.   原因:c程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在wi ...

  5. PHP对XML文件操作之属性与方法讲解

    DOMDocument相关的内容. 属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType 返回此节点的数据类型 Definit ...

  6. hdu 3807

    很好的思路     枚举有多少人有ipad 判是否满足题目给出的条件 #include <iostream> #include <cstring> #include <c ...

  7. iOS 通过代码关闭应用程序

    //-------------------------------- 退出程序 -----------------------------------------// - (void)exitAppl ...

  8. log4j使用感受

    1.为什么使用日志? 日志可以记录项目中的重要信息,关键输出信息,异常信息,为项目上线后期维护提供方便,在项目开发中尽量养成习惯写日志,而不是System.out.println()打印,不过在jun ...

  9. Code::Blocks生成的EXE文件执行错误解决:The program can't start because libgcc_s_dw2-1.dll is missing

    想用C++弄个简单东东,看有没有可行性, 开发软件,微软的太大太肿,就选用了Code::Blocks. 测试HELLO时,在工程环境中没问题的,但生成的EXE执行有问题, 报什么 libgcc_s_d ...

  10. P1082 找朋友

    描述 童年的我们,对各种事物充满了好奇与向往.这天,小朋友们对数字产生了兴趣,并且想和数字交朋友.可是,怎么分配这些数字才能使得每个小朋友都唯一地找到一个数字朋友呢?C小朋友说:咱们按自己名字的字典序 ...