Android Socket 机制(即demoen 服务进程的机制)

1. init.rc 中有
    service vold /system/bin/vold
    console
    socket vold stream 0660 root mount
    ioprio be 2
2. system\core\init\init.c 中init_parse_config_file("/init.rc");会解析;   init_parse_config_file-->parse_config-->lookup_keyword(得到的类型有K_service和K_socket)-->parse_new_section-->parse_service-->添加到service_list;
3. init.c中main函数中queue_builtin_action(keychord_init_action, "keychord_init");-->keychord_init_action-->keychord_init-->service_for_each
4. init.c中main函数中queue_builtin_action(..)-->action_add_queue_tail会把keychord_init_action生成一个action添加到action_list中同时还会添加到action_queue中(用于队列执行)
5. init.c中main函数中execute_one_command-->action_remove_queue_head,会执行所有的service 一遍并同时把执行过的item 移出action_queue
6. init.c中main函数中 restart_processes();会判断分析当前service_list的所有service状态,如果不是SVC_ONESHOT并且为 SVC_RESTARTING则重新启动该service
7. execute_one_command和restart_processes最终都会执行到init.c中service_start函数,如果有K_socket属性就会执行create_socket(...)和 publish_socket(...)
8. 手机中 dev/socket/vold
9. Android创建的socket没有端口(port)和地址(IP addr)? 用如下函数创建和绑定,其中bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen)中的struct sockaddr有两种赋值方式
    mSock = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_KOBJECT_UEVENT);
    bind(mSock, (struct sockaddr *) &nladdr, sizeof(nladdr));
    struct sockaddr_nl
    {
     sa_family_t nl_family;
     unsigned short nl_pad;
     __u32 nl_pid; //process id
     __u32 nl_groups;
    };
    
    fd = socket(PF_UNIX, type, 0);
    bind(fd, (struct sockaddr *) &addr, sizeof (addr));
    struct sockaddr_un {
     sa_family_t sun_family;
     char sun_path[UNIX_PATH_MAX];//文件路径  e.g /dev/socket/vold;根据#define ANDROID_SOCKET_DIR "/dev/socket";
    };
    以上都是为了进程间通信,两者有啥区别?


你可能感兴趣的:(android,struct,list,socket,service,action)