Caffe在1.0版本仅支持两种信号的处理: 1) SIGHUP 2) SIGINT

  • SIGHUP:caffe接收到此信号后进行snapshot,并不会中断caffe的训练.
  • SIGINT:caffe接收到此信号后进行snapshot,并退出.

参考issue #2012对这个问题的讨论.在PR 2253中对这两种信号做了支持,在Solver中回调信号检查函数.

当我们使用kill PID来停止caffe进程时发送的是SIGTERM(15)信号,caffe并没有处理,将直接退出.
如果我们想让它捕捉该信号并进行snapshot,可以添加代码使其与SIGINT的处理一致.
具体方法如下:
编辑src/caffe/util/signal_handler.cpp

void handle_signal(int signal) {
    switch (signal) {
    case SIGHUP:
      got_sighup = true;
      break;
    case SIGINT:
      got_sigint = true;
      break;
    case SIGTERM:
      got_sigint = true; // 当作SIGINT
      break;
    }
}

HookupHandler 与 UnhookHandler 中注册和取消SIGTERM:
sigaction(SIGTERM, &sa, NULL)

涉及基本的C语言信号处理函数,不再赘述.