tree-wide: set SA_RESTART for signal handlers we install

We already set it in most cases, but make sure to set it in all others too, and
document that that's a good idea.
This commit is contained in:
Lennart Poettering 2016-11-30 15:07:43 +01:00
parent 7b4318b6a5
commit e28c7cd066
4 changed files with 8 additions and 3 deletions

View File

@ -429,3 +429,8 @@
and Linux/GNU-specific APIs, we generally prefer the POSIX APIs. If there and Linux/GNU-specific APIs, we generally prefer the POSIX APIs. If there
aren't, we are happy to use GNU or Linux APIs, and expect non-GNU aren't, we are happy to use GNU or Linux APIs, and expect non-GNU
implementations of libc to catch up with glibc. implementations of libc to catch up with glibc.
- Whenever installing a signal handler, make sure to set SA_RESTART for it, so
that interrupted system calls are automatically restarted, and we minimize
hassles with handling EINTR (in particular as EINTR handling is pretty broken
on Linux).

View File

@ -339,7 +339,7 @@ static void sigchld_hdl(int sig) {
static int install_chld_handler(void) { static int install_chld_handler(void) {
static const struct sigaction act = { static const struct sigaction act = {
.sa_flags = SA_NOCLDSTOP, .sa_flags = SA_NOCLDSTOP|SA_RESTART,
.sa_handler = sigchld_hdl, .sa_handler = sigchld_hdl,
}; };

View File

@ -3632,7 +3632,7 @@ static int run(int master,
static const struct sigaction sa = { static const struct sigaction sa = {
.sa_handler = nop_signal_handler, .sa_handler = nop_signal_handler,
.sa_flags = SA_NOCLDSTOP, .sa_flags = SA_NOCLDSTOP|SA_RESTART,
}; };
_cleanup_release_lock_file_ LockFile uid_shift_lock = LOCK_FILE_INIT; _cleanup_release_lock_file_ LockFile uid_shift_lock = LOCK_FILE_INIT;

View File

@ -143,7 +143,7 @@ static int adm_monitor(struct udev *udev, int argc, char *argv[]) {
/* set signal handlers */ /* set signal handlers */
act.sa_handler = sig_handler; act.sa_handler = sig_handler;
act.sa_flags = SA_RESTART; act.sa_flags = SA_RESTART|SA_RESTART;
sigaction(SIGINT, &act, NULL); sigaction(SIGINT, &act, NULL);
sigaction(SIGTERM, &act, NULL); sigaction(SIGTERM, &act, NULL);
sigemptyset(&mask); sigemptyset(&mask);