[pacman-dev] [PATCH 0/1] signhandler add SIGQUIT soft_interrupt_handler
Hello, eveyone! I'am a newbie, because of the experience of using pacman downloading with the `Ctrl +\` exit was not very good,it leave the database lock, so I am thinking can we just deal with SIGQUIT rather than doing nothing. Hopefully this will improve the experience of users. Thanks. ZheNing Hu (1): signhandler: add SIGQUIT soft_interrupt_handler src/pacman/sighandler.c | 3 +++ 1 file changed, 3 insertions(+) -- 2.31.0
When we downloading with pacman. If we want to stop downloading, use `Ctrl +C` can exit normally, and "Interrupt signal received" will be print on the terminal. But if we accidentally use `Ctrl + \` to exit the download, it's not quite so perfect. The program exits with a segment fault, the database lock file was not deleted in time. The next time we use pacman downloading, the error will appear. So we can add signal handler with SIGQUIT, just like we did with SIGINT and SIGHUP. This way the user doesn't have to delete lock file manually. Signed-off-by: ZheNing Hu <adlternative@gmail.com> --- src/pacman/sighandler.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pacman/sighandler.c b/src/pacman/sighandler.c index ff54dce8..9fdbf917 100644 --- a/src/pacman/sighandler.c +++ b/src/pacman/sighandler.c @@ -81,15 +81,18 @@ void install_soft_interrupt_handler(void) new_action.sa_flags = SA_RESTART; sigemptyset(&new_action.sa_mask); sigaddset(&new_action.sa_mask, SIGINT); + sigaddset(&new_action.sa_mask, SIGQUIT); sigaddset(&new_action.sa_mask, SIGHUP); sigaction(SIGINT, &new_action, NULL); + sigaction(SIGQUIT, &new_action, NULL); sigaction(SIGHUP, &new_action, NULL); } void remove_soft_interrupt_handler(void) { _reset_handler(SIGINT); + _reset_handler(SIGQUIT); _reset_handler(SIGHUP); } -- 2.31.0
On 7/4/21 8:47 pm, ZheNing Hu wrote:
When we downloading with pacman. If we want to stop downloading, use `Ctrl +C` can exit normally, and "Interrupt signal received" will be print on the terminal. But if we accidentally use `Ctrl + \` to exit the download, it's not quite so perfect. The program exits with a segment fault, the database lock file was not deleted in time. The next time we use pacman downloading, the error will appear.
So we can add signal handler with SIGQUIT, just like we did with SIGINT and SIGHUP. This way the user doesn't have to delete lock file manually.
Signed-off-by: ZheNing Hu <adlternative@gmail.com> ---
From the glibc manual:
"Certain kinds of cleanups are best omitted in handling SIGQUIT. For example, if the program creates temporary files, it should handle the other termination requests by deleting the temporary files. But it is better for SIGQUIT not to delete them, so that the user can examine them in conjunction with the core dump. " https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html
src/pacman/sighandler.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/src/pacman/sighandler.c b/src/pacman/sighandler.c index ff54dce8..9fdbf917 100644 --- a/src/pacman/sighandler.c +++ b/src/pacman/sighandler.c @@ -81,15 +81,18 @@ void install_soft_interrupt_handler(void) new_action.sa_flags = SA_RESTART; sigemptyset(&new_action.sa_mask); sigaddset(&new_action.sa_mask, SIGINT); + sigaddset(&new_action.sa_mask, SIGQUIT); sigaddset(&new_action.sa_mask, SIGHUP);
sigaction(SIGINT, &new_action, NULL); + sigaction(SIGQUIT, &new_action, NULL); sigaction(SIGHUP, &new_action, NULL); }
void remove_soft_interrupt_handler(void) { _reset_handler(SIGINT); + _reset_handler(SIGQUIT); _reset_handler(SIGHUP); }
On 4/7/21 6:47 AM, ZheNing Hu wrote:
When we downloading with pacman. If we want to stop downloading, use `Ctrl +C` can exit normally, and "Interrupt signal received" will be print on the terminal. But if we accidentally use `Ctrl + \` to exit the download, it's not quite so perfect. The program exits with a segment fault, the database lock file was not deleted in time. The next time we use pacman downloading, the error will appear.
So we can add signal handler with SIGQUIT, just like we did with SIGINT and SIGHUP. This way the user doesn't have to delete lock file manually.
The entire point of SIGQUIT is to let users kill a program in such a way that it produces a coredump. "You can think of this as a program error condition 'detected' by the user." I'm curious how one might accidentally do this.
Signed-off-by: ZheNing Hu <adlternative@gmail.com> --- src/pacman/sighandler.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/src/pacman/sighandler.c b/src/pacman/sighandler.c index ff54dce8..9fdbf917 100644 --- a/src/pacman/sighandler.c +++ b/src/pacman/sighandler.c @@ -81,15 +81,18 @@ void install_soft_interrupt_handler(void) new_action.sa_flags = SA_RESTART; sigemptyset(&new_action.sa_mask); sigaddset(&new_action.sa_mask, SIGINT); + sigaddset(&new_action.sa_mask, SIGQUIT); sigaddset(&new_action.sa_mask, SIGHUP);
sigaction(SIGINT, &new_action, NULL); + sigaction(SIGQUIT, &new_action, NULL); sigaction(SIGHUP, &new_action, NULL); }
void remove_soft_interrupt_handler(void) { _reset_handler(SIGINT); + _reset_handler(SIGQUIT); _reset_handler(SIGHUP); }
-- Eli Schwartz Bug Wrangler and Trusted User
participants (3)
-
Allan McRae
-
Eli Schwartz
-
ZheNing Hu