parse_inittab:
在这个函数中会读取默认的配置文件,也就是"/etc/inittab" ,假如没有这个文件就用默认的属性来生成一个"/etc/inittab" ,来看看默认生成的"/etc/inittab":
if (file == NULL) {
/* No inittab file -- set up some default behavior */
#endif
/* Reboot on Ctrl-Alt-Del */
new_init_action(CTRLALTDEL, "reboot", "");
/* Umount all filesystems on halt/reboot */
// ::SHUTDOWN:umount -a -r
new_init_action(SHUTDOWN, "umount -a -r", "");
/* Swapoff on halt/reboot */
if (ENABLE_SWAPONOFF)
new_init_action(SHUTDOWN, "swapoff -a", "");
/* Prepare to restart init when a HUP is received */
new_init_action(RESTART, "init", "");
/* Askfirst shell on tty1-4 */
new_init_action(ASKFIRST, bb_default_login_shell, "");
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
/* sysinit */
new_init_action(SYSINIT, INIT_SCRIPT, "");
return;
#if ENABLE_FEATURE_USE_INITTAB
}
规定的格式为:
每个new_init_action都是一条写配置文件的函数,下面是对应关系:
new_init_action(CTRLALTDEL, "reboot", ""); -> ::CTRLALTDEL:"reboot"
new_init_action(SHUTDOWN, "umount -a -r", ""); -> ::SHUTDOWN:"umount -a -r"
ENABLE_SWAPONOFF这里没有定义如果在PC上的话会打开这个宏,嵌入式系统不存在内存交换
new_init_action(RESTART, "init", ""); -> ::RESTART: "init"
new_init_action(ASKFIRST, bb_default_login_shell, ""); -> ::ASKFIRST: "-/bin/sh"
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);-> /dev/tty2::ASKFIRST: "-/bin/sh"
new_init_action(ASKFIRST, bb_default_login_shell, VC_3);-> /dev/tty3::ASKFIRST: "-/bin/sh"
new_init_action(ASKFIRST, bb_default_login_shell, VC_4);-> /dev/tty4::ASKFIRST: "-/bin/sh"
new_init_action(SYSINIT, INIT_SCRIPT, ""); -> ::SYSINIT: "/etc/init.d/rcS"
有了这个配置文件之后每一个配置项都会生成一个init_action,结构体定义为:
struct init_action {
struct init_action *next;
int action;
pid_t pid;
char command[INIT_BUFFS_SIZE];
char terminal[CONSOLE_NAME_SIZE];
};
传入的三个参数分别用来填充action,command(就是具体的程序),terminal
然后生成一个链表,busybox中这个链表是init_action_list
执行run_actions(SYSINIT); -> run_actions(WAIT); -> run_actions(ONCE);
通过查看run_actions的源代码,可以看到他就是到上面生成的链表中去匹配传入的参数然后执行对应的函数,
对于标识是(SYSINIT | WAIT | CTRLALTDEL | SHUTDOWN | RESTART))这些的函数执行方式是:
执行->等待完成->删除标识以及对应的函数
假如action是once的话执行方式是:
执行 -> 删除标识以及对应的函数
少了等待完成这一步
然后程序进入死循环:
run_actions(RESPAWN);
run_actions(ASKFIRST);
这两者差别就在于进入命令行之前要不要先输入一个回车