阅读 505

Android 系统启动(一)---fork机制

fork() 机制

父进程通过 fork() 可以孵化出一个子进程。相当于是一个进程变成了两个进程。同时具有以下特点:

  1. 这两个进程代码一致,而且代码执行到的位置也一致。
  2. 区别是进程ID(PID)不一样。
  3. 一次调用,两次返回。父进程返回的是子进程的 PID,从而让父进程可以跟踪子进程的状态,以子进程 PID 作为函数参数。子进程返回的是0。

举个实例

    private static boolean startSystemServer(String abiList, String socketName)
            throws MethodAndArgsCaller, RuntimeException {
        .....
        int pid;

        try {
            parsedArgs = new ZygoteConnection.Arguments(args);
            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

            /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }
        /* For child process */
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

            handleSystemServerProcess(parsedArgs);
        }

        return true;
    }
复制代码

Zygote 进程通过 forkSystemServer() 函数最终 fork 出来两个进程。父进程得到的变量 pid 为子进程的 PID,将直接 return true。然后通过 runSelectLoop(abiList); 方法进入一个死循环,成为一个守护进程,并且存在一个 Socket,用于后续响应其他指令。子进程得到的返回值变量 pid 为0,最终会执行 handleSystemServerProcess(parsedArgs);