FFmpeg的信号处理—ffmpeg.c源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
ffmpeg 配置 信号处理函数是在 term_init() 函数里面的,他的函数调用位置如下:

这个函数比较简单,大部分的信号都是用同一个函数 sigterm_handler()来处理。如下:

我们平时用的最多的信号,就是这个 SIGINT。因为在 ffmpeg 命令运行过程中,当你想终止任务的之后,就会去按 ctrl+c,这时候就会向 ffmpeg 的进程发送一个 SIGINT 信号。
ffmpeg 命令接收到 SIGINT 信号之后,会执行 sigterm_handler() 函数,如下:
sigterm_handler(int sig)
{
    int ret;
    received_sigterm = sig;
    received_nb_signals++;
    term_exit_sigsafe();
    if(received_nb_signals > 3) {
        ret = write(2/*STDERR_FILENO*/, "Received > 3 system signals, hard exiting\n",
                    strlen("Received > 3 system signals, hard exiting\n"));
        if (ret < 0) { /* Do nothing */ };
        exit(123);
    }
}
当你按第一次 ctrl+c 的时候, received_sigterm 变量就会从 NULL 变成 SIGINT(2)。当 received_sigterm 不为 NULL,transcode() 函数就会跳出循环,不再读取 AVPacket 来进行处理,如下:

可以看到,虽然跳出了 while(...) 循环,但是后面还有一些 flush 解码器缓存,write trailer,清理资源的代码需要执行,这些也是需要时间的,并不是按  ctrl+c 就会立即退出进程,ffmpeg 需要一些时间执行清理代码,优雅地退出。
不过 ffmpeg 的开发者考虑得非常周到,如果你想快速退出进程,可以连续按 4 次 ctrl+c ,接受到 3 次以上 SIGINT 信号就会执行 exit 退出进程,如下:

广告:本人罗上文现在是声网的渠道合作商,各位如果有需要使用声网的产品,请通过我的渠道邀请链接注册,我会给与一定的优惠折扣。欢迎加我微信Loken1咨询。
