action
- #if DEBUG_SEGV_HANDLER
- {
- struct sigaction sa;
- memset(&sa, 0, sizeof(sa));
- sa.sa_sigaction = handle_sigsegv;
- sa.sa_flags = SA_SIGINFO;
- sigaction(SIGSEGV, &sa, NULL);
- ......
- }
- #endif
- ......
- console_init();
- set_sane_term();
- ......
- /* Make sure environs is set to something sane */
- putenv((char *) "HOME=/");
- putenv((char *) bb_PATH_root_path);
- putenv((char *) "SHELL=/bin/sh");
- putenv((char *) "USER=root"); /* needed? why? */
action包含:sysinit、respawn、askfirst、wait、once、restart、ctrlaltdel、和shutdown共八种,
process
注释说的是启动shell到console口,不管,持续看
指定要运行的法度榜样和它的参数
然后还说了如不雅没有inittab文件,则运行以下内容
- ::sysinit:/etc/init.d/rcS
- ::askfirst:/bin/sh
- ::ctrlaltdel:/sbin/reboot
- ::shutdown:/sbin/swapoff -a
- ::shutdown:/bin/umount -a -r
- ::restart:/sbin/init
- tty2::askfirst:/bin/sh
- tty3::askfirst:/bin/sh
- tty4::askfirst:/bin/sh
这应当就是代码中如不雅读不到inittab文件,则履行的一系列net_init_action的内容
再往下看,出现的第一条示例entry
是不是很熟悉,linux体系嵌入式设备里平日会有/etc/init.d/rcS这个文件,它是一个shell脚本,根据前面的格局,分析一下,id和runlevel为空,action为sysinit,process为/etc/init.d/rcS,所以第一件要干的工作是去履行rcS脚本,而rcS脚本里可以做本身想做的任何工作了
下一条示例是
- tty4::respawn:/sbin/getty 38400 tty5
- tty5::respawn:/sbin/getty 38400 tty6
开启getty
- ::restart:/sbin/init
指定init过程的重启地位
- ::ctrlaltdel:/sbin/reboot
- ::shutdown:/bin/umount -a -r
- ::shutdown:/sbin/swapoff -a
在重启之前要做的工作
再回到代码上,这个while()轮回遍历了inittab文件的每一个entry,解析出entry的四个部分:id、runlevel、action和process,放到一个指针数组char *token[4]中,则token[2]和token[3]代表action和process,法度榜样里调用index_in_strings()函数将token[2]转成字符串,即“sysinit”等值,再调用net_init_action(),分析net_init_action()源码可以看出,其实只是把这些action和process添加到一个链表中,并没有做实际的处理,真正的处理在后续的代铝闼楝parse_inittab()函数返回,