这两天被linux下的一个rc0.d,rc1.d,rc2.d,rc3.d这个脚本被搞懵了,一直搞手机,没见过这种情况。
主要是关于init.rc脚本跟rcX.d的先后顺序的问题。但是首先要找到rcX.d是在哪里执行的。
看了网上的一些关于rcX.d的介绍 http://blog.csdn.net/it1988888/article/details/8051657。
busybox/init/init.c
-
static void parse_inittab(void)
-
{
-
#if ENABLE_FEATURE_USE_INITTAB
-
char *token[4];
-
parser_t *parser = config_open2("/etc/inittab", fopen_for_read);
首先busybox的init程序去解析/etc/inittab文件。这个文件里面记录了一些配置信息。
那么inittab文件中记录了些什么呢?
-
l0:0:wait:/etc/init.d/rc 0
-
l1:1:wait:/etc/init.d/rc 1
-
l2:2:wait:/etc/init.d/rc 2
-
l3:3:wait:/etc/init.d/rc 3
-
l4:4:wait:/etc/init.d/rc 4
-
l5:5:wait:/etc/init.d/rc 5
-
l6:6:wait:/etc/init.d/rc 6
继续往下看init.c文件,可以看到具体是怎么解析这个文件的。
-
#if ENABLE_FEATURE_USE_INITTAB
-
/* optional_tty:ignored_runlevel:action:command
-
* Delims are not to be collapsed and need exactly 4 tokens
-
*/
-
while (config_read(parser, token, 4, 0, "#:",
-
//以#或者;来划分,分别放在toke中
-
//以 l6:6:wait:/etc/init.d/rc 6为例
-
//token[0] = "16"
-
//token[1] = "6"
-
//token[2] = "wait"
-
//token[3] = "/etc/init.d/rc 6"
-
PARSE_NORMAL & ~(PARSE_TRIM | PARSE_COLLAPSE))) {
-
/* order must correspond to SYSINIT..RESTART constants */
-
static const char actions[] ALIGN1 =
-
"sysinit\0""wait\0""once\0""respawn\0""askfirst\0"
-
"ctrlaltdel\0""shutdown\0""restart\0";
-
int action;
-
char *tty = token[0];
-
-
if (!token[3]) /* less than 4 tokens */
-
goto bad_entry;
-
action = index_in_strings(actions, token[2]);
-
if (action < 0 || !token[3][0]) /* token[3]: command */
-
goto bad_entry;
-
/* turn .*TTY -> /dev/TTY */
-
if (tty[0]) {
-
tty = concat_path_file("/dev/", skip_dev_pfx(tty));
-
}
-
new_init_action(1 << action, token[3], tty);
-
if (tty[0])
-
free(tty);
-
continue
这样就将这几个action_type为wait的action加到了队列中。
最终会在init程序中执行这些action。
-
run_actions(SYSINIT);
-
check_delayed_sigs();
-
/* Next run anything that wants to block */
-
run_actions(WAIT);
-
check_delayed_sigs();
-
/* Next run anything to be run only once */
-
run_actions(ONCE)
最后就是/etc/init.d/rc脚本了
-
runlevel=$RUNLEVEL
-
# Get first argument. Set new runlevel to this argument.
-
[ "$1" != "" ] && runlevel=$1
-
if [ "$runlevel" = "" ]
-
then
-
echo "Usage: $0 " >&2
-
exit 1
-
fi
-
previous=$PREVLEVEL
-
[ "$previous" = "" ] && previous=N
-
-
export runlevel previous
-
-
# Is there an rc directory for this new runlevel?
-
if [ -d /etc/rc$runlevel.d ]
会根据第一个参数去找相应的/etc/rc$runlevel.d文件夹是否存在,去查找文件夹下的文件并执行。
阅读(1902) | 评论(0) | 转发(0) |