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
退出进程,如下: