diff options
author | Mike Pall <mike> | 2025-03-09 15:50:01 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2025-03-09 15:50:01 +0100 |
commit | 423ac2144b0447c925596f4d93e073ce501ed4e1 (patch) | |
tree | b1537bfeca7429baa05d8b175b3208a01fe55163 | |
parent | 54dc2fa5d77ec35df302dc9bedc6ad7b0b4eae25 (diff) | |
download | luajit-423ac2144b0447c925596f4d93e073ce501ed4e1.tar.gz luajit-423ac2144b0447c925596f4d93e073ce501ed4e1.tar.bz2 luajit-423ac2144b0447c925596f4d93e073ce501ed4e1.zip |
Improve CLI signal handling on POSIX.
-rw-r--r-- | src/luajit.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/luajit.c b/src/luajit.c index a725db1c..2e2e9150 100644 --- a/src/luajit.c +++ b/src/luajit.c | |||
@@ -35,6 +35,21 @@ | |||
35 | 35 | ||
36 | #if !LJ_TARGET_CONSOLE | 36 | #if !LJ_TARGET_CONSOLE |
37 | #include <signal.h> | 37 | #include <signal.h> |
38 | |||
39 | #if LJ_TARGET_POSIX | ||
40 | /* Improve signal handling on POSIX. Try CTRL-C on: luajit -e 'io.read()' */ | ||
41 | static void signal_set(int sig, void (*h)(int)) | ||
42 | { | ||
43 | struct sigaction sa; | ||
44 | memset(&sa, 0, sizeof(sa)); | ||
45 | sa.sa_handler = h; | ||
46 | sigemptyset(&sa.sa_mask); | ||
47 | sigaction(sig, &sa, NULL); | ||
48 | } | ||
49 | #else | ||
50 | #define signal_set signal | ||
51 | #endif | ||
52 | |||
38 | #endif | 53 | #endif |
39 | 54 | ||
40 | static lua_State *globalL = NULL; | 55 | static lua_State *globalL = NULL; |
@@ -54,8 +69,8 @@ static void lstop(lua_State *L, lua_Debug *ar) | |||
54 | 69 | ||
55 | static void laction(int i) | 70 | static void laction(int i) |
56 | { | 71 | { |
57 | signal(i, SIG_DFL); /* if another SIGINT happens before lstop, | 72 | /* Terminate process if another SIGINT happens (double CTRL-C). */ |
58 | terminate process (default action) */ | 73 | signal_set(i, SIG_DFL); |
59 | lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); | 74 | lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); |
60 | } | 75 | } |
61 | #endif | 76 | #endif |
@@ -117,11 +132,11 @@ static int docall(lua_State *L, int narg, int clear) | |||
117 | lua_pushcfunction(L, traceback); /* push traceback function */ | 132 | lua_pushcfunction(L, traceback); /* push traceback function */ |
118 | lua_insert(L, base); /* put it under chunk and args */ | 133 | lua_insert(L, base); /* put it under chunk and args */ |
119 | #if !LJ_TARGET_CONSOLE | 134 | #if !LJ_TARGET_CONSOLE |
120 | signal(SIGINT, laction); | 135 | signal_set(SIGINT, laction); |
121 | #endif | 136 | #endif |
122 | status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base); | 137 | status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base); |
123 | #if !LJ_TARGET_CONSOLE | 138 | #if !LJ_TARGET_CONSOLE |
124 | signal(SIGINT, SIG_DFL); | 139 | signal_set(SIGINT, SIG_DFL); |
125 | #endif | 140 | #endif |
126 | lua_remove(L, base); /* remove traceback function */ | 141 | lua_remove(L, base); /* remove traceback function */ |
127 | /* force a complete garbage collection in case of errors */ | 142 | /* force a complete garbage collection in case of errors */ |