Busybox-1.22.1
注意:头文件applet_tables.h是在编译时生成的,还有其他几个文件如autoconf.h/usage.h/...也是。
libbb/appletlib.c/main()
applet_name = argv[0] // 命令name
run_applet_and_exit(applet_name, argv)
applet = find_applet_by_name(name) // 根据名字找到index
run_applet_no_and_exit(applet, argv)
applet_main[applet_no](argc, argv) // 根据index调用对应的函数
init命令 -- init_main()
init/init.c/init_main()
// 注册halt/reboot/poweroff信号处理
bb_signals(0+ (1 << SIGPWR) /* halt */ + (1 << SIGUSR1) /* halt */+ (1 << SIGTERM) /* reboot */+ (1 << SIGUSR2) /* poweroff */, halt_reboot_pwoff)
poweroff命令 -- halt_main()
init/halt.c/halt_main()
signals[] = { SIGUSR1, SIGUSR2, SIGTERM }
kill(1, signals[which]) // 根据不同命令向1号进程发送不同信号
init/init.c/halt_reboot_pwoff()
run_shutdown_and_kill_processes()
pause_and_low_level_reboot()
reboot(magic) // 系统调用reboot
kernel/sys.c/SYSCALL_DEFINE4(reboot)
kernel_power_off()