diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c index 342dc89ca..ffc8714c3 100644 --- a/cmds/dumpstate/dumpstate.c +++ b/cmds/dumpstate/dumpstate.c @@ -378,8 +378,8 @@ static void usage() { } static void sigpipe_handler(int n) { - (void)n; - exit(EXIT_FAILURE); + // don't complain to stderr or stdout + _exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { @@ -404,10 +404,12 @@ int main(int argc, char *argv[]) { } ALOGI("begin\n"); + memset(&sigact, 0, sizeof(sigact)); sigact.sa_handler = sigpipe_handler; sigaction(SIGPIPE, &sigact, NULL); + /* set as high priority, and protect from OOM killer */ setpriority(PRIO_PROCESS, 0, -20); FILE *oom_adj = fopen("/proc/self/oom_adj", "w"); diff --git a/cmds/dumpstate/utils.c b/cmds/dumpstate/utils.c index a6d9ef6bd..85c353e10 100644 --- a/cmds/dumpstate/utils.c +++ b/cmds/dumpstate/utils.c @@ -313,6 +313,12 @@ int run_command(const char *title, int timeout_seconds, const char *command, ... /* make sure the child dies when dumpstate dies */ prctl(PR_SET_PDEATHSIG, SIGKILL); + /* just ignore SIGPIPE, will go down with parent's */ + struct sigaction sigact; + memset(&sigact, 0, sizeof(sigact)); + sigact.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &sigact, NULL); + va_list ap; va_start(ap, command); if (title) printf("------ %s (%s", title, command);