【问题标题】:Most important signals to handle?要处理的最重要的信号?
【发布时间】:2012-07-22 00:26:19
【问题描述】:

最近我正在开发一个用 c 编写的软件,它有大约 3-4 千行代码。当我开始遇到分段错误时,我添加了一个 SIGSEGV 处理程序。这有助于我将错误定位为处理程序被做了一个回溯。

我的问题是除了 SIGSEGV 之外,当我们拥有大型软件时应该处理哪些重要信号,这样错误检测就会很容易。

这可以选择性地用于防止攻击。 Ex 软件在执行关键更新/操作时接收中止信号。标准告诉 SIGHUP、SIGINT、SIGKILL、SIGPIPE、SIGTERM 和其他一些信号具有终止该信号传递到的进程的默认属性。

因此,要为我的软件添加另一层保护,我必须更改这些信号的行为。保护是指我不希望我的软件在关键更新之间终止,我会决定关于何时中止。

编辑:我想知道软件设计得如何,如何处理信号,像安全网一样使用它们,这有助于软件的构建。

【问题讨论】:

    标签: c debugging signals signal-handling


    【解决方案1】:

    嗯,你不是 100% 清楚你对答案的期望,但我会尽量涵盖一般的想法。

    首先,你可以称之为“调试”的信号是(以及何时可以期待它们):

    1. SIGILLSIGFPE — 如果程序试图运行非法指令,通常会出现错误的 CFLAGS 和/或自己的程序集(或严重的随机损坏);
    2. SIGABRT — 由 abort() 调用引起,例如在 assert() 中。它也可以来自图书馆,因此您通常应该处理它;
    3. SIGSEGV — 无效的内存访问,你可能已经知道了;
    4. SIGBUS — 使用 mmap() 进行 I/O 并尝试读/写不可访问的内存时可能发生;当基于 mmap() 的 I/O 空间不足时,我也遇到过这种情况;
    5. SIGPIPE — 在管道上执行 I/O 时,管道与另一端断开连接;
    6. POSIX 还为无效的系统调用指定 SIGSYS,您可能也想抓住它(尽管我从未设法看到)。

    如果您使用相关操作,我会说您需要处理这些信号。它们都在 POSIX 中,但我不确定是否所有系统都实现了它们,所以无论如何你可能都想为它们使用#ifdefs(SIG* 保证是宏,因此适用于#ifdef)。

    您在程序运行时可能遇到的其他信号是:

    1. SIGALRM — 使用 alarm() 时,
    2. SIGPOLL — 使用轮询时,
    3. SIGCHLD — 生成进程时……

    这些基本上是您在使用相关操作时无论如何都要处理的信号,尽管它们默认终止,但无论如何您应该有其他处理程序。

    最后,如果您希望处理 user 发送的信号,这是一个苛刻的情况——因为用户实际上可以发送每个信号。因此,如果您想优雅地处理这一切,您需要捕获来自man signal 的每个信号,这些信号默认为终止或中止操作。

    如果您只想捕获您可以预期的常见信号子集,这些将是:

    1. SIGHUP 当带有程序的终端(或其他相关的父级)死亡时,
    2. SIGINT 用于 ^c 键,
    3. SIGQUIT 为 ^\ 键,
    4. SIGTERM 用于终止请求(默认由kill 程序和其他类似工具发送),
    5. SIGUSR1SIGUSR2 是用户定义的信号,通常用于执行程序特定的操作。它们由用户发送,并且出于某种原因默认会终止程序。

    还有SIGKILL,但标准不允许捕获它。

    我希望我涵盖了最重要的信号。请注意,我是 Linux 用户,其他 *nix 可能有一些您也可能想要捕捉的特定信号。

    这通常取决于您想要达到的目标。虽然防止软件被随机信号打断是个好主意,但通常不值得阻止它被所有这些信号杀死,尤其是那些仅由用户​​直接发送的信号。

    如果用户想要杀死应用程序,他无论如何都可以实现它,应该只处理常见的 - SIGINTSIGTERM。我个人希望SIGQUIT (^\ key) 杀死应用程序而不让它完成甚至关键任务(就像SIGKILL 一样)。

    编辑。作为最后一句话的理由,请考虑以下几点:我刚刚做了一些愚蠢的事情,比如删除了一些重要数据。或者只是注意到退出时清理程序有问题。我真的想终止程序,以确保我的信号不会被捕获,但会导致它立即返回。即使它会导致数据损坏,有时我真的更喜欢损坏数据(希望我能够恢复我需要的东西)而不是没有数据

    【讨论】:

    • 不错的答案,+1,只是添加一点SIGBUS 我认为也可能是对齐错误。
    • 很抱歉不接受这个作为正确答案..因为这是与设计相关的问题......但是感谢我想知道的事情的详细信息
    • @Deepthought:如果没有更好的结果,它会自动接受,IIRC。
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2011-07-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多