Zygote孵化System_server的最后阶段ForkAndSpecializeCommon里会调用SetSigChldHandler设置信号处理函数。SetSigChldHandler定义了信号处理函数SigChldHandler,当信号SIGCHLD到来的时候,会进入信号处理函数。如果子进程SystemServer挂了,Zygote就会自杀。从而导致Zygote重启。
frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
static void SigChldHandler(int /*signal_number*/) {
pid_t pid;
int status;
//Zygote监听所有子进程的存亡
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
//某一个子进程挂了
if (WIFSIGNALED(status)) {
if (WTERMSIG(status) != SIGKILL) {
ALOGI("Process %d exited due to signal (%d)", pid, WTERMSIG(status));
}
}
//如果挂掉的是SystemServer
if (pid == gSystemServerPid) {
ALOGE("Exit zygote because system server (%d) has terminated", pid);
kill(getpid(), SIGKILL); //Zygote自杀
}
}
}
而如果Zygote收到被kill的信号,会调用kill(-pid_, SIGKILL),pid < 0将该信号发送给其进程组id等于pid的绝对值的进程组,导致System_Server被杀。系统重启。
system/core/init/service.cpp
bool ServiceManager::ReapOneProcess() {
......
if (WIFEXITED(status)) {
NOTICE("%s exited with status %d\n", name.c_str(), WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
NOTICE("%s killed by signal %d\n", name.c_str(), WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
NOTICE("%s stopped by signal %d\n", name.c_str(), WSTOPSIG(status));
} else {
NOTICE("%s state changed", name.c_str());
}
if (svc->Reap()) {
waiting_for_exec = false;
RemoveService(*svc);
}
......
}
bool Service::Reap() {
if (!(flags_ & SVC_ONESHOT) || (flags_ & SVC_RESTART)) {
NOTICE("Service '%s' (pid %d) killing any children in process group\n",
name_.c_str(), pid_);
kill(-pid_, SIGKILL); //pid < 0将该信号发送给其进程组id等于pid的绝对值的进程组,但是不包含某些系统进程!
}
.................
}
导致Zygote重启的一些事件,从init*rc可以看出,
Zygote:挂掉会触发media、netd以及子进程(包括System_Server进程)重启;
System_Server: 挂掉触发zygote重启;
surfaceflinger:重启触发zygote重启;
servicemanager: 重启触发zygote重启
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
service servicemanager /system/bin/servicemanager
class core
user system
group system
critical
onrestart restart healthd
onrestart restart zygote
onrestart restart media
onrestart restart surfaceflinger
onrestart restart drm
service surfaceflinger /system/bin/surfaceflinger
class core
user system
group graphics drmrpc
onrestart restart zygote
https://blog.csdn.net/abc_1234d/article/details/72480992