我刚刚看到一些代码使用kill系统调用向应用程序发送SIGSEGV信号。这样做的原理是强制应用程序生成核心转储并退出。我觉得这种做法很不妥当,这是正常的做法吗?
SIGQUIT是向程序发送正确的信号,如果您希望生成核心转储。 kill
是发送信号的正确命令行程序(当然名称不当,因为并非所有信号都会杀死程序)。
请注意,您不应向程序发送随机信号,其中许多信号将由程序本身处理,即被消耗、忽略或引发其他处理。 因此,发送SIGSEGV是错误的。
GCC说: http://www.gnu.org/s/libc/manual/html_node/Termination-Signals.html
POSIX/Unix说: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html
是的。 kill
名称有些不准确 - 它可以发送任何信号。使用 kill
的方法有很多,其中许多并不会导致进程被终止!
raise
和 abort
,当目标是自己时,这两个函数更加有意义。 - R.. GitHub STOP HELPING ICERichard Stevens(《UNIX环境高级编程》)写道:
大多数Unix实现都具有核心生成功能,但它不是POSIX.1的一部分。
他列出了12个信号,其默认操作是以核心终止(ANSI:SIGABRT、SIGFPE、SIGILL、SIGSEGV,POSIX:SIGQUIT,其他:SIGBUS、SIGEMT、SIGIOT、SIGSYS、SIGTRAP、SIGXCPU、SIGXFSZ),所有这些信号都可以被覆盖(唯二不能被覆盖的信号是SIGKILL和SIGSTOP)。
我从未见过一种生成核心的方法,它不是使用默认信号处理程序。
因此,如果您的目标是生成核心并停止,最好选择一个默认处理程序执行该任务的信号(SIGSEGV执行该任务),如果正在使用该信号,则重置该信号的默认处理程序,然后使用kill。
mmap
和MAP_FIXED
将其映射回其“堆”之上。 - R.. GitHub STOP HELPING ICE