****************************************************************************

Android 4.4 init进程分析文章链接

  Android 4.4 Init进程分析一 :Android init进程概述

  Android 4.4 Init进程分析二 :Android初始化语言

  Android 4.4 Init进程分析三:init.rc脚本文件的解析

  Android 4.4 Init进程分析四 :init.rc脚本文件的执行

  Android 4.4 Init进程分析五 :进程的终止与再启动

  Android 4.4 Init进程分析六 :属性服务

***************************************************************************

 

1 概述

  init进程读取并分析init.rc文件,获得服务列表service_list,而后从列表中依次启动服务子进程。

  init进程启动的主要进程如下:

  • sh:  搭载Android的机器终端,连接串口或adbd时,提供控制台输入输出的shell程序。
  • adbd: 指Android Debug Bridge,原来管理QEMU模拟器或实际机器的状态。该工具运行在目标机器(模拟器或物理机器)上,充当服务器,PC充当连接服务器的客户端。
  • servicemanager: 是Android比较正要的一个进程,在init进程启动后启动,用来管理系统中的服务。
  • vold: 指Volume Dameon,用来挂载/管理USB存储或SD卡设备。

  除了以上这些进程外,init进程还启动其他多种进程。若init启动的某个进程终止,则会对系统的运行产生影响。比如“服务管理器”(servicemanager),它是应用程序使用系统服务必须运行的进程。如果该进程出现意外终止,那么进程间的通信、图像输出、音频输出等功能都将无法使用。因此在init启动的进程中,除了一小部分外,其它大部分进程出现意外终止时,init进程都要重新启动它们。

 

  通过前面两篇文章的分析,我们已经知道init进程会启动服务列表中的服务,创建相应的子进程。当子进程意外终止时,会向父进程init进程传递SIGCHLD信号,init进程接收到该信号后,检查进程选项是否设置为oneshot,若设置为oneshot,init进程放弃重启进程;否则重启进程。

 

Android 4.4 Init进程分析五 :进程的终止与再启动

 

 

 

  关于init进程如何重启子进程,接下来详细分析

2 进程再启动代码分析

  关于进程(service)的重启,我们还要从init进程的main()函数说起,在main()函数中有一个“内建action”: signal_init

http://androidxref.com/4.4_r1/xref/system/core/init/init.c#1065

1 queue_builtin_action(signal_init_action, "signal_init");

当init进程执行这个action时就回去调用signal_init_action()函数:

http://androidxref.com/4.4_r1/xref/system/core/init/init.c#800

1 static int signal_init_action(int nargs, char **args)
2 {
3     signal_init();
4     return 0;
5 }

进而调用到signal_init()函数:

http://androidxref.com/4.4_r1/xref/system/core/init/signal_handler.c#131

 1 void signal_init(void)
 2 {
 3     int s[2];
 4 
 5     struct sigaction act;
 6     memset(&act, 0, sizeof(act));
 7     act.sa_handler = sigchld_handler;
 8     act.sa_flags = SA_NOCLDSTOP;
 9     sigaction(SIGCHLD, &act, 0);
10 
11     /* create a signalling mechanism for the sigchld handler */
12     if (socketpair(AF_UNIX, SOCK_STREAM, 0, s) == 0) {
13         signal_fd = s[0];
14         signal_recv_fd = s[1];
15         fcntl(s[0], F_SETFD, FD_CLOEXEC);
16         fcntl(s[0], F_SETFL, O_NONBLOCK);
17         fcntl(s[1], F_SETFD, FD_CLOEXEC);
18         fcntl(s[1], F_SETFL, O_NONBLOCK);
19     }
20 
21     handle_signal();
22 }
View Code

相关文章: