如果我发出信号,我的程序退出代码应该是什么?

时间:2016-09-01 10:49:36

标签: c++ signals posix exit-code

我想我可能暂时做错了一段时间,因为我们刚刚切换到systemd而且它正在考虑我干净利落的进程结束失败。

基本上我会倾听SIGHUPSIGINTSIGTERM然后(通过将信号代码重新传递回main),例如return 128+SIGHUP

我希望这可以用来填充$?,但现在我想我明白shell负责给$?这样的值,然后只有当信号未处理时。因此,即使该过程最终由于信号而退出,因为信号已被处理,$?将最终为0,并且所有与退出信号有关的证据都将丢失。是吗?

在处理SIGHUP并彻底退出时,我应return EXIT_SUCCESS来自main吗?

2 个答案:

答案 0 :(得分:5)

高级Bash脚本编写指南(https://stackoverflow.com/a/1535733/567292)推广了返回128 + <signal number>的惯例,但仅适用于您的程序失败的情况接收信号。

如果您的程序收到信号,处理它,并因此终止,退出状态(例如由wait提供)将类似但不是位7集将设置更高的位以指示WIFSIGNALED而不是WIFEXITED。如果你在shell中运行,那么translated by the shell将提供128-255范围内的退出状态($?)(即设置了第7位),因此就shell脚本而言关注的是,返回128+n的程序与终止的程序无法区分,因为信号未处理:

  

[...]当使用特殊参数'?'报告退出状态时,shell应报告可用的完整8位退出状态。由于收到信号而终止的命令的退出状态应报告为大于128。

如果您的程序收到信号,然后成功退出,则视为成功终止,因此您的程序应返回EXIT_SUCCESS

答案 1 :(得分:2)

返回代码通常是您指定的代码。如果要在退出代码中包含信号,则必须确保它们仍然保持唯一。

如果您不需要退出代码中的信号,那么似乎没有理由包含它们。

是否退回EXIT_SUCCESSEXIT_FAILURE取决于您/您的计划,无论终止是成功还是失败。