当前位置:操作系统 > 安卓/Android >>

Android培训班(9)

android系统的初始化过程是从那里开始呢?它在加载linux基本内核后,就开始运行一个初始化进程,叫做init进程,那么怎么样知道它是加载init进程的呢?难道上天就注定的吗?呵呵,不是的,原来是从android加载linux内核时,就设置了下面的参数:

Kernel command line: noinitrd root=/dev/nfs console=ttySAC0 init=/init nfsroot=192.168.1.103:/nfsboot ip=192.168.1.20:192.168.1.103:192.168.1.1:255.255.255.0::eth0:on

 

在这行命令里,就是告诉linux内核初始化完成后开始运行init进程,由于init进程就是放在系统根目录下面。而这个进程的代码,就是位于源码的目录system/core/init下面,现在就来仔细地分析这个进程到底做了什么事情,以便理解整个系统运行情况。在分析过程中,会学习很多有用知识,甚至linux编程知识。这么有用,还等什么呢?现在就开始,找到目录system/core/init/init.c代码,先从main函数开始,如下:

#001  int main(int argc, char **argv)

#002  {

#003      int device_fd = -1;

#004      int property_set_fd = -1;

#005      int signal_recv_fd = -1;

#006      int keychord_fd = -1;

#007      int fd_count;

#008      int s[2];

#009      int fd;

#010      struct sigaction act;

#011      char tmp[PROP_VALUE_MAX];

#012      struct pollfd ufds[4];

#013      char *tmpdev;

#014      char* debuggable;

#015 

#016 

#017      act.sa_handler = sigchld_handler;

#018      act.sa_flags = SA_NOCLDSTOP;

#019      act.sa_mask = 0;

#020      act.sa_restorer = NULL;

#021      sigaction(SIGCHLD, &act, 0);

在上面这段代码里,调用函数sigaction来设置处理子进程发送回来的关闭信号,其中SIGCHLD是设置子进程信号处理,SA_NOCLDSTOP是表示子进程结束时不要向父进程发送SIGCHLD,sigchld_handler是信号SIGCHLD的处理函数。这样做的作用,就是如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。因此需要对SIGCHLD信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。

 

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,