void init(void)
{
int pid,i;
//设置环境信息
setup((void *) &drive_info);
//打印提示语句
sprintf(term, "TERM=con%dx%d", ORIG_VIDEO_COLS, ORIG_VIDEO_LINES);
//打开终端1
(void) open("/dev/tty1",O_RDWR,0);
//拷贝打开的描述字1 ,2;
(void) dup(0);
(void) dup(0);
//运行初始化函数
execve("/etc/init",argv_init,envp_init);
execve("/bin/init",argv_init,envp_init);
execve("/sbin/init",argv_init,envp_init);
/* if this fails, fall through to original stuff */
//启动子程序
if (!(pid=fork())) {
//子程序操作
//关闭父进程打开的0描述字
close(0);
//打开自己的运行模式描述字
if (open("/etc/rc",O_RDONLY,0))
_exit(1);
//再执行shell命令。
execve("/bin/sh",argv_rc,envp_rc);
_exit(2);
}
//父进程往下运行。
if (pid>0)
// 等待子程序退出
while (pid != wait(&i))
/* nothing */;
//子程序退出后,父进程做补充操作
while (1) {
//再循环启动子进程
if ((pid = fork()) < 0) {
printf("Fork failed in init\n\r");
continue;
}
if (!pid) {
//进入子进程操作
//关闭 父进程的3个描述字
close(0);close(1);close(2);
//分开父进程和子进程会话
setsid();
//子进行拷贝终端描述字
(void) open("/dev/tty1",O_RDWR,0);
(void) dup(0);
(void) dup(0);
//子进程运行shell
_exit(execve("/bin/sh",argv,envp));
}
while (1)
//如果为父进程等待子进程完成后退出当前循环
if (pid == wait(&i))
break;
//打印子进程结束信息。
printf("\n\rchild %d died with code %04x\n\r",pid,i);
//数据同步,把缓存区的数据写到磁盘
sync();
}
//父进程结束
_exit(0);
}