Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88265
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 231
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-13 21:06
个人简介

来也匆匆 几十繁华一阵风; 去也匆匆 回头一看已成空

文章分类

全部博文(24)

文章存档

2016年(4)

2015年(20)

我的朋友

分类: LINUX

2015-06-19 14:15:30

    前一段时间看了下android/init的源码,service_start里面有如下一段代码:

点击(此处)折叠或打开

  1. pid = fork();


  2.     if (pid == 0) {
  3.         struct socketinfo *si;
  4.         struct svcenvinfo *ei;
  5.         char tmp[32];
  6.         int fd, sz;


  7.         umask(077);
  8.         if (properties_inited()) {
  9.             get_property_workspace(&fd, &sz);
  10.             sprintf(tmp, "%d,%d", dup(fd), sz);
  11.             add_environment("ANDROID_PROPERTY_WORKSPACE", tmp); <====
  12.         }


  13.         ... ...




  14.         if (!dynamic_args) {
  15.             if (execve(svc->args[0], (char**) svc->args, (char**) ENV) < 0) {
  16.                 ERROR("cannot execve('%s'): %s\n", svc->args[0], strerror(errno));
  17.             }
  18.         } else {
  19. ... ...
  20.             arg_ptrs[arg_idx] = '\0';
  21.             execve(svc->args[0], (char**) arg_ptrs, (char**) ENV);
  22.         }
  23. }


    从上面这段片段中我们可以看到,通过环境变量将fd文件描述符传递给了exec要执行的程序了。想到这,有点纳闷了,exec不是载入新程序,会将当前进程的代码段、数据段、堆栈段全部覆盖么?那么fd对应的数据不是也无效了么?网上找了半天,也没有找到答案,万能的man,给出了答案:
“By default, file descriptors remain open across an execve(). ”

    execve()调用成功后不会返回,其进程的正文(text),据(data),bss和堆栈(stack)段被调入程序覆盖.调入程序继承了调用程序 的 PID 和所有打开的文件描述符,他们不会因为exec过程而关闭.父进程的未决信号被清除.所有被 调用进程设置过的信号重置为缺省行为.


阅读(1947) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~