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);
}