[FFmpeg-devel] [PATCH 1/2] ffmpeg: use sigaction() instead of signal() on linux
Andriy Gelman
andriy.gelman at gmail.com
Sun Dec 13 18:41:36 EET 2020
On Sat, 28. Nov 14:46, Andriy Gelman wrote:
> From: Andriy Gelman <andriy.gelman at gmail.com>
>
> As per signal() help (man 2 signal) the semantics of using signal may
> vary across platforms. It is suggested to use sigaction() instead.
>
> On my system, the capture signal is reset to the default handler after
> the first call thus failing to properly handle multiple SIGINTs.
>
> Signed-off-by: Andriy Gelman <andriy.gelman at gmail.com>
> ---
> fftools/ffmpeg.c | 31 +++++++++++++++++++++++++++----
> 1 file changed, 27 insertions(+), 4 deletions(-)
>
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> index 80f436eab3..01f4ef15d8 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -393,8 +393,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;
> + 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;
> @@ -413,14 +435,15 @@ 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);
> + SIGNAL(SIGTERM, sigterm_handler);
> +
> #ifdef SIGXCPU
> - signal(SIGXCPU, sigterm_handler);
> + SIGNAL(SIGXCPU, sigterm_handler);
> #endif
> #ifdef SIGPIPE
> signal(SIGPIPE, SIG_IGN); /* Broken pipe (POSIX). */
ping
--
Andriy
More information about the ffmpeg-devel
mailing list