From f61b110cf6d77044e813499ec6ce667813a697cd Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 12 Oct 2010 14:01:58 -0700 Subject: [PATCH] Add signal handlers so we clean up before exiting. Add SIGTERM and SIGINT signal handlers so that we run the exit handlers before exiting when getting these signals. Fixes an issue where we couldn't run vi after CTRL+C'ing node because the stdin fd was left non-blocking. --- src/node.cc | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/node.cc b/src/node.cc index aea2570637..14fc56549a 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1768,6 +1768,21 @@ static void AtExit() { } +static void SignalExit(int signal) { + ev_unloop(EV_DEFAULT_ EVUNLOOP_ALL); +} + + +static int RegisterSignalHandler(int signal, void (*handler)(int)) { + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = handler; + sigfillset(&sa.sa_mask); + return sigaction(signal, &sa, NULL); +} + + int Start(int argc, char *argv[]) { // Hack aroung with the argv pointer. Used for process.title = "blah". argv = node::OS::SetupArgs(argc, argv); @@ -1792,10 +1807,9 @@ int Start(int argc, char *argv[]) { V8::SetFlagsFromCommandLine(&v8argc, v8argv, false); // Ignore SIGPIPE - struct sigaction sa; - bzero(&sa, sizeof(sa)); - sa.sa_handler = SIG_IGN; - sigaction(SIGPIPE, &sa, NULL); + RegisterSignalHandler(SIGPIPE, SIG_IGN); + RegisterSignalHandler(SIGINT, SignalExit); + RegisterSignalHandler(SIGTERM, SignalExit); // Initialize the default ev loop.