init: Cleanly exit subcontext processes upon init's death
This change makes the subcontext processes cleanly exit in the event of the init's socket being closed. If that was an accident, init will respawn the process immediately. Otherwise, it will just quietly go away. Bug: 80425914 Test: kill -9 $INIT_PID # Outside of an Android container Change-Id: I664f11d1b3700ea46857abf24857335fe28e92fa
This commit is contained in:
parent
146fd24c4b
commit
7235359d2e
1 changed files with 9 additions and 1 deletions
|
|
@ -62,7 +62,9 @@ constexpr size_t kBufferSize = 4096;
|
|||
Result<std::string> ReadMessage(int socket) {
|
||||
char buffer[kBufferSize] = {};
|
||||
auto result = TEMP_FAILURE_RETRY(recv(socket, buffer, sizeof(buffer), 0));
|
||||
if (result <= 0) {
|
||||
if (result == 0) {
|
||||
return Error();
|
||||
} else if (result < 0) {
|
||||
return ErrnoError();
|
||||
}
|
||||
return std::string(buffer, result);
|
||||
|
|
@ -175,6 +177,12 @@ void SubcontextProcess::MainLoop() {
|
|||
|
||||
auto init_message = ReadMessage(init_fd_);
|
||||
if (!init_message) {
|
||||
if (init_message.error_errno() == 0) {
|
||||
// If the init file descriptor was closed, let's exit quietly. If
|
||||
// this was accidental, init will restart us. If init died, this
|
||||
// avoids calling abort(3) unnecessarily.
|
||||
return;
|
||||
}
|
||||
LOG(FATAL) << "Could not read message from init: " << init_message.error();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue