Netd和framework层的通信
这两者的通信时通过unix domain socket来完成的。
系统初始化的时候会从init.rc里面读取并创建socket,名字叫netd
service netd /system/bin/netd class main socket netd stream 0660 root system socket dnsproxyd stream 0660 root inet socket mdns stream 0660 root system |
1. 先来看一下socket的创建过程
手机开机的时候执行init.c的main函数
int main(int argc, char **argv) { ……… restorecon("/dev"); restorecon("/dev/socket");//创建的socket文件在这个目录下 ……... init_parse_config_file("/init.rc"); ……… } |
init_parse_config_file调用init_parse.c的parse_config函数里处理init.rc的数据。
Socket的处理是在parse_line_service里面,保存socketinfo到一个链表里面
static void parse_line_service(struct parse_state *state, int nargs, char **args) { case K_socket: {/* name type perm [ uid gid ] */ struct socketinfo *si; if (nargs < 4) { parse_error(state, "socket option requires name, type, perm arguments\n"); break; } if (strcmp(args[2],"dgram") && strcmp(args[2],"stream") && strcmp(args[2],"seqpacket")) { parse_error(state, "socket type must be 'dgram', 'stream' or 'seqpacket'\n"); break; } si = calloc(1, sizeof(*si)); if (!si) { parse_error(state, "out of memory\n"); break; } si->name = args[1]; si->type = args[2]; si->perm = strtoul(args[3], 0, 8); if (nargs > 4) si->uid = decode_uid(args[4]);//userID if (nargs > 5) si->gid = decode_uid(args[5]);//groupID si->next = svc->sockets; svc->sockets = si; break; } |
Socket真正的创建过程是在启动service的时候,即调用函数service_start的时候
void service_start(struct service *svc, const char *dynamic_args) { ………. for (si = svc->sockets; si; si = si->next) { int socket_type = (!strcmp(si->type, "stream") ? SOCK_STREAM : (!strcmp(si->type, "dgram") ? SOCK_DGRAM : SOCK_SEQPACKET)); int s = create_socket(si->name, socket_type, si->perm, si->uid, si->gid); if (s >= 0) { publish_socket(si->name, s); } } ………… } |
这里做了两个操作,create_socket是创建socket