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";
};
以上都是为了进程间通信,两者有啥区别?
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之进程通信机制(下)(AIDL,Messenger,Socket)
- Android 利用广播机制来进行SERVICE后台服务进程的守护
- Android IPC机制(五)用Socket实现跨进程聊天程序
- Android IPC机制(五)用Socket实现跨进程聊天程序
- Android IPC机制(五)用Socket实现跨进程聊天程序
- Android TV 添加系统服务,通过Binder机制从APK对其进行跨进程远程调用
- Android IPC机制(五)用Socket实现跨进程聊天程序
- Android系统在新进程中启动自定义服务过程(startService)的原理分析 (下)
- Android跨进程之Binder机制概述
- Android中如何利用AIDL机制调用远程服务
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android Binder机制----实现自定义的系统服务
- android 进程/线程管理(四)续----消息机制的思考(自定义消息机制)
- Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析
- AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)
- (4.4.13)android系统服务的进程
- Binder机制5--- Binder实现进程管理服务示例
- Android系统在新进程中启动自定义服务过程(startService)的原理分析、Android应用程序绑定服务(bindService)的过程源代码分析
- Android应用层使用共享内存机制进行进程间交换数据
- android基础笔记:服务(Service)跨进程调用Service(AIDL Service)