来也匆匆 几十繁华一阵风; 去也匆匆 回头一看已成空
分类: LINUX
2015-06-19 14:15:30
前一段时间看了下android/init的源码,service_start里面有如下一段代码:
点击(此处)折叠或打开
从上面这段片段中我们可以看到,通过环境变量将fd文件描述符传递给了exec要执行的程序了。想到这,有点纳闷了,exec不是载入新程序,会将当前进程的代码段、数据段、堆栈段全部覆盖么?那么fd对应的数据不是也无效了么?网上找了半天,也没有找到答案,万能的man,给出了答案:
“By default, file descriptors remain open across an execve(). ”
execve()调用成功后不会返回,其进程的正文(text),据(data),bss和堆栈(stack)段被调入程序覆盖.调入程序继承了调用程序 的 PID 和所有打开的文件描述符,他们不会因为exec过程而关闭.父进程的未决信号被清除.所有被 调用进程设置过的信号重置为缺省行为.