首页 > 程序开发 > 移动开发 > Android >

Android培训班(9)

2011-03-08

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

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信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。

相关文章
最新文章
热点推荐