您的位置:首页 > 移动开发 > Android开发

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

2012-06-11 11:14 375 查看
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";

};

以上都是为了进程间通信,两者有啥区别?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐