Dee*_*ght 4 c debugging signals signal-handling
最近我正在研究一个用c编写的软件,它有大约3-4万行代码.当我开始出现分段错误时,我添加了一个SIGSEGV处理程序.这帮助我指出错误,因为处理程序是给一个回溯.
我的问题是除了SIGSEGV之外,当我们拥有一个大型软件时,应该处理哪些重要信号,以便错误检测很容易.
这可以任选地用于防止攻击.Ex软件在进行关键更新/操作时接收中止信号.标准告诉SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGTERM和一些其他信号具有默认属性来终止传递此信号的进程.
因此,要为我的软件添加另一层保护,我将不得不改变这些信号的行为.通过保护我的意思是我不希望我的软件在crtical更新之间终止,我将决定何时中止.
编辑:我想知道如何设计好的软件,处理SIGNAL,像安全网一样使用它们,这有助于软件的构建.
好吧,你不是100%清楚你对答案的期望,但我会试着涵盖一般的想法.
首先,您可以称之为"调试"信号(以及何时期望它们):
SIGILL,SIGFPE- 如果程序试图运行非法指令,通常会出现错误CFLAGS和/或自己的程序集(或严重的随机破坏);SIGABRT- 由abort()呼叫引起的,例如在assert().它也可以来自图书馆,所以你通常应该处理它;SIGSEGV - 内存访问无效,你可能已经知道了所有内容;SIGBUS- 在执行I/O mmap()并尝试读取/写入不可访问的内存时可能会发生; 在mmap()基于空间的I/O运行时,它也发生在我身上;SIGPIPE - 在管道上进行I/O时,管道与另一侧断开;SIGSYS了无效的系统调用,您可能也希望捕获它(尽管我从未设法看到它).如果您使用相关操作,我会说您需要处理这些信号.它们都在POSIX中,但我不确定是否所有系统都实现它们,所以你可能想要#ifdef为它们使用s(SIG*保证是宏,因此适合#ifdef).
您可能通过程序运行时遇到的其他信号是:
SIGALRM- 使用时alarm(),SIGPOLL - 使用投票时,SIGCHLD - 产卵过程时......这些基本上是您在使用相关操作时正在处理的信号,虽然它们默认终止,但您仍应该为其配置其他处理程序.
最后,如果您希望处理用户发送的信号,这是一个严酷的情况 - 因为用户几乎可以发送每个信号.因此,如果您想要优雅地处理它,您需要捕获man signal默认为终止或中止操作的每个信号.
如果你想捕获一个你可以期望的共同信号子集,那么它们将是:
SIGHUP 当带有程序的终端(或其他一些父母,如果相关)死亡时,SIGINT 对于^ c键,SIGQUIT 对于^\key,SIGTERM对于终止请求(由kill程序默认发送和其他类似工具),SIGUSR1并且SIGUSR2是用户定义的信号,通常用于执行特定于程序的操作.它们由用户发送,并且 - 由于某种原因 - 默认为终止程序.还有,SIGKILL但标准不允许捕捉它.
我希望我能够涵盖最重要的信号.请注意,我是Linux用户,其他*nix可能有一些您可能想要捕获的特定信号.
它通常取决于你想要达到的目标.尽管防止软件被随机信号中断是一个好主意,但通常不值得防止它被所有这些软件杀死,尤其是那些仅由用户直接发送的软件.
如果用户想要杀死应用程序,他无论如何都可以实现它,并且它应该足以处理常见的应用程序 - SIGINT并且SIGTERM.我个人希望SIGQUIT(^\key)杀死应用程序而不让它完成甚至是关键任务(就像SIGKILL这样).
编辑.作为最后一句话的理由,请考虑以下几点:我刚刚做了一些愚蠢的事情,比如删除了一些重要的数据.或者只是注意到清理退出程序有问题.我真的想终止程序,确保我的信号不会被捕获,但会立即返回.即使它会导致数据损坏,有时我真的更愿意破坏数据(希望我能够恢复我需要的)而不是数据.
| 归档时间: |
|
| 查看次数: |
760 次 |
| 最近记录: |