【Android系列2.0 进程 --- init进程】

init进程

Android加载Linux内核后,开始运行初始化进程init

Kernelcommand line: noinitrd root=/dev/nfs console=ttySACO init=/initnfsroot...
  • init进程启动后,扫描init.rc配置文件
  • init进程进入无限循环,执行command(启动其他进程)
    • 系统ps -e的所有进程,都是init的子进程

源文件

由一组源文件的目标文件链接而成的

  • /system/core/init (目录)
  • frameworks/base/core/jni (目录)
  • \bionic\libc\bionic\libc_init_common.h
  • \bionic\libc\bionic\libc_init_common.c
  • \bionic\libc\bionic\libc_init_dynamic.c
  • \bionic\libc\bionic\libc_init_static.c
  • \system\core\libcutils\properties.c

入口函数main的文件system\core\init\init.c

入口函数

1. 初始化 解析
int main(int argc, char **argv)
{
//***
    mkdir("/dev", 0755);
    mkdir("/proc", 0755);
    mkdir("/sys", 0755);
    mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
    mkdir("/dev/pts", 0755);
    mkdir("/dev/socket", 0755);
    mount("devpts", "/dev/pts", "devpts", 0, NULL);
    mount("proc", "/proc", "proc", 0, NULL);
    mount("sysfs", "/sys", "sysfs", 0, NULL);
//****
    parse_config_file("/init.rc");
//***
}
// /init.rc
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd
2. 使用for循环,无限循环建立子进程
//***
    ufds[0].fd = device_fd;
    ufds[0].events = POLLIN;
    ufds[1].fd = property_set_fd;
    ufds[1].events = POLLIN;
    ufds[2].fd = signal_recv_fd;
    ufds[2].events = POLLIN;
    fd_count = 3;

//***    
    for(;;) {
//*** poll是一个关键点
        nr = poll(ufds, fd_count, timeout);
        if (nr <= 0)
            continue;
        if (ufds[2].revents == POLLIN) {
            /* we got a SIGCHLD - reap and restart as needed */
            read(signal_recv_fd, tmp, sizeof(tmp));
            while (!wait_for_one_process(0))
                ;
            continue;
        }
        if (ufds[0].revents == POLLIN)
            handle_device_fd(device_fd);
        if (ufds[1].revents == POLLIN)
            handle_property_set_fd(property_set_fd);
        if (ufds[3].revents == POLLIN)
            handle_keychord(keychord_fd);
    }
//***
//***

依旧是在一个无限for循环中,通过poll阻塞在指定的 IO操作上(等待 文件描述符指定的),接受信息进行处理(和Looper里的信息机制一样)

Zygote

socket采用的是 Unix Domain Socket

  • 用于本机IPC
  • 采用socket文件,而不是ip+socket
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值