[FFmpeg-devel] [PATCH 1/2] ffmpeg: use sigaction() instead of signal() on linux

Andriy Gelman andriy.gelman at gmail.com
Sun Jan 10 18:09:50 EET 2021


On Sun, 13. Dec 11:41, Andriy Gelman wrote:
> 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
> 

ping

-- 
Andriy


More information about the ffmpeg-devel mailing list