LINUX内核解读 求教

woody009 2003-08-22 06:25:47
读了赵炯博士的LINUX 0.11的详细注解
对于/init/中的MAIN.c文件中的后面一小部分不大理解
179 if(!(pid=fork()){
180 close(0);
181 if(open("/etc/rc",0_RDONLY,0))
182 _exit(1);
183 execve("/bin/sh",argc_rc,envp_rc);
184 _exit(2);
185 }

186 if(pid>0)
187 while(pid!=wait(&i))
188 /**/
189 while(1){
if((pid=fork())<0){
printf("Fork failed in init\r\n";
continue;
}
if(!pid){
close(0);close(1);close(2);
setsid();
(void) open("/dev/tty0",0_RDWR,0);
(void) dup(0);
(void) dup(0);
_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);
}

从186行开始我不大理解这都是在干什么嘛? 我觉得183行的execve调用是不会返回的啊 那么下面的代码不就没有执行的机会了嘛? 就算调用失败,下面的代码我觉得没有必要搞的 那么复杂 用一个while(1);不就行了 干吗还让初始进程创建一个子进程呢?有什么意义?
请高手详解 谢谢
...全文
81 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
CoolQ 2003-08-22
  • 打赏
  • 举报
回复
初步看了一下代码,179-185行是先生成一个shell,但是这个shell只是执行/etc/rc.d下的启动脚本,运行完以后,shell就结束了。
在186上,是父进程,等运行rc.d的子进程结束以后,自己再生成一个子进程,然后子进程先关闭所有继承父进程的fd,包括0,1,2,然后将fd 0,1,2也就是STDIN_FILENO, STDOUT_FILENO,STDERR_FILENO与/dev/tty0,也就是终端相关联,并再次生成一个shell,接收用户输入的命令,父进程等待子进程的结束,打印出退出状态并开始新一轮的运行。

BTW:为什么看0.11版的Linux呢?觉得2.4.x的Linux太大?其实看内核是很需要耐心的,而且技术总是在不断进步的,所以有条件的话,还是多接触一些新东西吧
tkit 2003-08-22
  • 打赏
  • 举报
回复
execve后确实不返回了,但是下面的代码属于父进程地代码,当然会执行的拉

23,117

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧