summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeir Hauge <geir.hauge@ntnu.no>2014-03-31 09:52:03 +0200
committerFedor Indutny <fedor@indutny.com>2014-04-12 12:40:31 +0400
commitc61b0e9cbc748c5e90fc5e25e4fb490b4104cae3 (patch)
tree500f1d446d6f8a23c462ae2f2c7a3bcb06b3ed2b
parent8e823bcbe6543acac17cff790f6f19665f54556d (diff)
downloadnode-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.cc15
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);