《Android的设计与实现:卷I》——第3章 3.3init进程的执行过程

    xiaoxiao2022-05-26  190

    3.3 init进程的执行过程

    init进程是用户空间的第一个进程,进程号为1。Android世界中,很多重要的工作都是从它开始的。init进程相关源码位于/system/core/init目录下,从其编译文件Android.mk中可以看到这部分源代码最终被编译为可执行文件init,代码如下:

    注意 pollfd是Linux中定义的结构体,用于存放需要监控事件的文件描述符,其定义如下: struct pollfd { int fd; //需要监控的文件描述符 short events; //监控fd上的事件,由调用方设置

    short revents; //fd上发生过的事件,由返回方设置 };

    poll的函数原型如下:

    int poll(struct pollfd fds[], nfds_t nfds, int timeout);

    nfds:用于标记fds[]中结构体元素的总数。

    timeout:用于标记poll函数调用的阻塞事件,单位是毫秒。如果timeout=0,则poll不阻塞,直接返回。poll返回fds中revents不为0的fd个数;如果超时没有任何事件发生,返回0;失败时,返回-1。通过对init.c文件中main函数的分析,可以将init的执行过程分为以下四个阶段:

    1)初始化文件系统和日志系统,为之后的执行阶段做准备。这部分主要是Linux标准函数的调用。

    2)解析 init.rc和init..rc初始化文件。

    3)触发需要执行的Action和Service。

    4)init循环监听处理事件。init触发所有Action后,进入一个无限循环,执行在可执行队列中的命令,重启异常退出的Service,并循环处理来自property service(属性服务)、signal和keychord的事件。

    第一阶段很容易理解,都是基本的Linux函数调用。接下来,将针对其余三个阶段详细讲解init的运行过程。

    相关资源:七夕情人节表白HTML源码(两款)

    最新回复(0)