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>
This commit is contained in:
parent
4ae2dfd7ea
commit
35eb5eeca8
@ -394,8 +394,30 @@ static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
|
|||||||
}
|
}
|
||||||
#endif
|
#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)
|
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 HAVE_TERMIOS_H
|
||||||
if (!run_as_daemon && stdin_interaction) {
|
if (!run_as_daemon && stdin_interaction) {
|
||||||
struct termios tty;
|
struct termios tty;
|
||||||
@ -414,14 +436,14 @@ void term_init(void)
|
|||||||
|
|
||||||
tcsetattr (0, TCSANOW, &tty);
|
tcsetattr (0, TCSANOW, &tty);
|
||||||
}
|
}
|
||||||
signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
|
SIGNAL(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
|
SIGNAL(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
|
||||||
signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
|
SIGNAL(SIGTERM, sigterm_handler); /* Termination (ANSI). */
|
||||||
#ifdef SIGXCPU
|
#ifdef SIGXCPU
|
||||||
signal(SIGXCPU, sigterm_handler);
|
SIGNAL(SIGXCPU, sigterm_handler);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SIGPIPE
|
#ifdef SIGPIPE
|
||||||
signal(SIGPIPE, SIG_IGN); /* Broken pipe (POSIX). */
|
signal(SIGPIPE, SIG_IGN); /* Broken pipe (POSIX). */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user