Chinaunix首页 | 论坛 | 博客
  • 博客访问: 752130
  • 博文数量: 79
  • 博客积分: 2671
  • 博客等级: 少校
  • 技术积分: 1247
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-02 15:26
个人简介

宅男

文章分类

全部博文(79)

文章存档

2017年(11)

2016年(12)

2015年(6)

2012年(10)

2011年(33)

2010年(7)

分类: Android平台

2017-03-22 17:51:04

这两天被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
  1. static void parse_inittab(void)
  2. {
  3. #if ENABLE_FEATURE_USE_INITTAB
  4.         char *token[4];
  5.         parser_t *parser = config_open2("/etc/inittab", fopen_for_read);
首先busybox的init程序去解析/etc/inittab文件。这个文件里面记录了一些配置信息。
那么inittab文件中记录了些什么呢?
  1. l0:0:wait:/etc/init.d/rc 0
  2. l1:1:wait:/etc/init.d/rc 1
  3. l2:2:wait:/etc/init.d/rc 2
  4. l3:3:wait:/etc/init.d/rc 3
  5. l4:4:wait:/etc/init.d/rc 4
  6. l5:5:wait:/etc/init.d/rc 5
  7. l6:6:wait:/etc/init.d/rc 6
继续往下看init.c文件,可以看到具体是怎么解析这个文件的。
  1. #if ENABLE_FEATURE_USE_INITTAB
  2.         /* optional_tty:ignored_runlevel:action:command
  3.          * Delims are not to be collapsed and need exactly 4 tokens
  4.          */
  5.         while (config_read(parser, token, 4, 0, "#:",
  6. //以#或者;来划分,分别放在toke中
  7. //以 l6:6:wait:/etc/init.d/rc 6为例
  8. //token[0] = "16"
  9. //token[1] = "6"
  10. //token[2] = "wait"
  11. //token[3] = "/etc/init.d/rc 6"
  12.                                 PARSE_NORMAL & ~(PARSE_TRIM | PARSE_COLLAPSE))) {
  13.                 /* order must correspond to SYSINIT..RESTART constants */
  14.                 static const char actions[] ALIGN1 =
  15.                         "sysinit\0""wait\0""once\0""respawn\0""askfirst\0"
  16.                         "ctrlaltdel\0""shutdown\0""restart\0";
  17.                 int action;
  18.                 char *tty = token[0];

  19.                 if (!token[3]) /* less than 4 tokens */
  20.                         goto bad_entry;
  21.                 action = index_in_strings(actions, token[2]);
  22.                 if (action < 0 || !token[3][0]) /* token[3]: command */
  23.                         goto bad_entry;
  24.                 /* turn .*TTY -> /dev/TTY */
  25.                 if (tty[0]) {
  26.                         tty = concat_path_file("/dev/", skip_dev_pfx(tty));
  27.                 }
  28.                 new_init_action(1 << action, token[3], tty);
  29.                 if (tty[0])
  30.                         free(tty);
  31.                 continue
这样就将这几个action_type为wait的action加到了队列中。
最终会在init程序中执行这些action。
  1.         run_actions(SYSINIT);
  2.         check_delayed_sigs();
  3.         /* Next run anything that wants to block */
  4.         run_actions(WAIT);
  5.         check_delayed_sigs();
  6.         /* Next run anything to be run only once */
  7.         run_actions(ONCE)
最后就是/etc/init.d/rc脚本了
  1.   runlevel=$RUNLEVEL
  2.   # Get first argument. Set new runlevel to this argument.
  3.   [ "$1" != "" ] && runlevel=$1
  4.   if [ "$runlevel" = "" ]
  5.   then
  6.     echo "Usage: $0 " >&2
  7.     exit 1
  8.   fi
  9.   previous=$PREVLEVEL
  10.   [ "$previous" = "" ] && previous=N

  11.   export runlevel previous

  12.   # Is there an rc directory for this new runlevel?
  13.   if [ -d /etc/rc$runlevel.d ]
会根据第一个参数去找相应的/etc/rc$runlevel.d文件夹是否存在,去查找文件夹下的文件并执行。







阅读(1902) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~