diff options
author | Geir Hauge <geir.hauge@ntnu.no> | 2014-03-31 09:52:03 +0200 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2014-04-12 12:40:31 +0400 |
commit | c61b0e9cbc748c5e90fc5e25e4fb490b4104cae3 (patch) | |
tree | 500f1d446d6f8a23c462ae2f2c7a3bcb06b3ed2b | |
parent | 8e823bcbe6543acac17cff790f6f19665f54556d (diff) | |
download | node-c61b0e9cbc748c5e90fc5e25e4fb490b4104cae3.tar.gz |
main: Handle SIGINT properly.
As explained by http://www.cons.org/cracauer/sigint.html
Signed-off-by: Fedor Indutny <fedor@indutny.com>
-rw-r--r-- | src/node.cc | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/node.cc b/src/node.cc index 37756e0ba..afa4f2b03 100644 --- a/src/node.cc +++ b/src/node.cc @@ -2793,9 +2793,9 @@ static void AtExit() { } -static void SignalExit(int signal) { +static void SignalExit(int signo) { uv_tty_reset_mode(); - _exit(128 + signal); + raise(signo); } @@ -3131,12 +3131,15 @@ static void EnableDebugSignalHandler(int signo) { } -static void RegisterSignalHandler(int signal, void (*handler)(int signal)) { +static void RegisterSignalHandler(int signal, + void (*handler)(int signal), + bool reset_handler = false) { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = handler; + sa.sa_flags = reset_handler ? SA_RESETHAND : 0; sigfillset(&sa.sa_mask); - sigaction(signal, &sa, NULL); + CHECK_EQ(sigaction(signal, &sa, NULL), 0); } @@ -3423,8 +3426,8 @@ void Init(int* argc, } // Ignore SIGPIPE RegisterSignalHandler(SIGPIPE, SIG_IGN); - RegisterSignalHandler(SIGINT, SignalExit); - RegisterSignalHandler(SIGTERM, SignalExit); + RegisterSignalHandler(SIGINT, SignalExit, true); + RegisterSignalHandler(SIGTERM, SignalExit, true); #endif // __POSIX__ V8::SetFatalErrorHandler(node::OnFatalError); |