FFmpeg的信号处理—ffmpeg.c源码分析

作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音

ffmpeg 配置 信号处理函数是在 term_init() 函数里面的,他的函数调用位置如下:

1-1

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

1-2

我们平时用的最多的信号,就是这个 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 来进行处理,如下:

1-2-2

可以看到,虽然跳出了 while(...) 循环,但是后面还有一些 flush 解码器缓存,write trailer,清理资源的代码需要执行,这些也是需要时间的,并不是按 ctrl+c 就会立即退出进程,ffmpeg 需要一些时间执行清理代码,优雅地退出。

不过 ffmpeg 的开发者考虑得非常周到,如果你想快速退出进程,可以连续按 4 次 ctrl+c ,接受到 3 次以上 SIGINT 信号就会执行 exit 退出进程,如下:

1-3


版权所属 xianwanzhiyin.net 罗上文 2024 all right reserved,powered by Gitbook该文件修订时间: 2024-10-28 23:30:25

results matching ""

    No results matching ""