深入剖析Android中init进程实现的C语言源码

2020-01-06 13:38:30丽君

从上述代码可以看到,init进程除了会预写入指定文件(例如:system/build.prop)属性外,还会创建一个UNIX Domain Socket,用于接受客户端的请求,构建属性。那这个socket请求是再哪里被处理的呢?

答案是:在init中的for循环处已经进行了相关处理。

服务端处理设置属性请求

接收属性设置请求的地方是在init进程中,相关代码如下所示:

 

 
  1. int main(int argc, char **argv)  { 
  2. // ...省略不相关代码   
  3. for (;;) {  // ... 
  4. for (i = 0; i < fd_count; i ++) {  if (ufds[i].fd == get_property_set_fd()) 
  5. handle_property_set_fd();  } 
  6. }  } 

从上述代码可以看出,当属性服务器收到客户端请求时,init进程会调用handle_property_set_fd函数进行处理,函数位置是:system/core/init/property_service.c,我们来看一下这个函数的实现源码:

 

 
  1. void handle_property_set_fd()  { 
  2. prop_msg msg;  int s; 
  3. int r;  int res; 
  4. struct ucred cr;  struct sockaddr_un addr; 
  5. socklen_t addr_size = sizeof(addr);  socklen_t cr_size = sizeof(cr); 
  6. char *source_ctx = NULL;   
  7. // 接收TCP连接  if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) { 
  8. return;  }