Browse Source

ffmpeg: use sigaction() instead of signal() on linux

As per signal() help (man 2 signal) the semantics of using signal may
vary across platforms. It is suggested to use sigaction() instead.

Reviewed-by: Zane van Iperen <zane@zanevaniperen.com>
Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
tags/n4.4
Andriy Gelman 4 years ago
parent
commit
35eb5eeca8
1 changed files with 26 additions and 4 deletions
  1. +26
    -4
      fftools/ffmpeg.c

+ 26
- 4
fftools/ffmpeg.c View File

@@ -394,8 +394,30 @@ static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
}
#endif

#ifdef __linux__
#define SIGNAL(sig, func) \
do { \
action.sa_handler = func; \
sigaction(sig, &action, NULL); \
} while (0)
#else
#define SIGNAL(sig, func) \
signal(sig, func)
#endif

void term_init(void)
{
#if defined __linux__
struct sigaction action = {0};
action.sa_handler = sigterm_handler;

/* block other interrupts while processing this one */
sigfillset(&action.sa_mask);

/* restart interruptible functions (i.e. don't fail with EINTR) */
action.sa_flags = SA_RESTART;
#endif

#if HAVE_TERMIOS_H
if (!run_as_daemon && stdin_interaction) {
struct termios tty;
@@ -414,14 +436,14 @@ void term_init(void)

tcsetattr (0, TCSANOW, &tty);
}
signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
SIGNAL(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
}
#endif

signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
SIGNAL(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
SIGNAL(SIGTERM, sigterm_handler); /* Termination (ANSI). */
#ifdef SIGXCPU
signal(SIGXCPU, sigterm_handler);
SIGNAL(SIGXCPU, sigterm_handler);
#endif
#ifdef SIGPIPE
signal(SIGPIPE, SIG_IGN); /* Broken pipe (POSIX). */


Loading…
Cancel
Save