c - 用于自定义信号处理程序的退出代码的最佳实践?

标签 c linux signals

我想对 SIGTERM 信号进行一些清理。同时我有代码检查过程返回代码和可能的信号退出。现在我对信号处理的最佳实践有疑问。是哪个?

void handle_sigterm(int sig) 
{ 
    /* cleaning up some stuff */
    /* … */
    /* but what exit code to use? */

    /* maybe 0, because the handler promises more graceful termination than default SIGTERM */
    _exit(0); 

    /* exit code as-if exited by SIGTERM, because that is what initiated termination */
    _exit(128+sig);

    /* similar to above, but leave the details for the default handler */
    signal(SIGTERM, SIG_DFL); /* (not entirely sure this is needed) */
    raise(SIGTERM);
}

最佳答案

_exit(0)选项错误;它表示成功。使用 _exit(EXIT_FAILURE); 可能没问题。通过重新发出信号而死亡允许父进程明确地确定该进程由于信号而死亡。 POSIX 使用 128 + SIGTERM 约定(shell 通过将 $? 设置为 128 加上信号来报告因信号而死亡的进程的退出状态数字),但它有点模棱两可,因为进程可以以该状态自愿退出,如您的代码所示可能这样做。

如果您的程序通常由 shell 调用,那么任何非零退出都可以,但“128 加信号数”变体中的任何一个都更好。如果您的程序通常由您自己的另一个进程调用,该进程可以有效地区分“最终死于信号”和“可能死于信号”,则“重新发出信号”选项可能是最好的,尽管它不常用于练习。

关于c - 用于自定义信号处理程序的退出代码的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57943975/

相关文章:

c - 如何用C代码编写shell '&'?

c - 为什么要在 snprintf 的第二个参数中添加 1 或 2?

linux - 如何移动第一行包含字符串的文件?

c++ - 在包含 500,000 个文件的目录中快速访问文件

c - 信号处理函数+不忽略SIGINT

C `signal` 参数太少

c - 如何防止引用的包含搜索当前源文件的目录?

c - OpenCV cvCanny 内存异常

php - Web 服务器上的 Ldap 连接

c++ - 了解 sigwait() 及其如何设置参数