adb: Mask SIGTTIN so that I/O works when backgrounded.

SIGTTIN gets sent to the process when we attempt to read from
stdin when we're in the background, which stops the process by
default. Mask the signal so that the read returns -1 with errno
set to EIO, instead.

Change-Id: I4ae626b0670c05a1a05165539b9eed709e83d536
This commit is contained in:
Josh Gao 2015-10-23 15:03:31 -07:00
parent 38aee48fc6
commit 8dcdb57daf
1 changed files with 9 additions and 0 deletions

View File

@ -39,6 +39,7 @@
#include <base/strings.h>
#if !defined(_WIN32)
#include <signal.h>
#include <termios.h>
#include <unistd.h>
#endif
@ -440,6 +441,14 @@ static void* stdin_read_thread(void* x) {
adb_thread_setname("stdin reader");
#ifndef __WIN32
// Mask SIGTTIN in case we're in a backgrounded process
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGTTIN);
pthread_sigmask(SIG_BLOCK, &sigset, nullptr);
#endif
char raw_buffer[1024];
char* buffer_ptr = raw_buffer;
size_t buffer_size = sizeof(raw_buffer);