当我尝试执行命令" / bin / kill -11 0"在bash,tcsh或zsh上,它不会发生段错误,但是当我尝试在我的网站上执行此操作时,确实会这样做。
所以我必须拥有一些我无法处理的东西。
你知道它可能是什么吗?
感谢。
答案 0 :(得分:3)
当程序发送信号11时,你的程序实际上并不是段错误。
如果程序的执行导致"段故障" (即程序执行非法内存引用),然后操作系统发送程序SIGSEGV(Linux上的信号11)。程序无法区分操作系统由于程序错误而发送的SIGSEGV和通过调用raise
或kill
发送的SIGSEGV,可能来自另一个进程,因此它将作出响应有一个真正的程序错误。
如果要保护shell免受来自子进程发送到pid 0的信号的影响,则需要通过在fork之后调用子进程中的setpgid来确保子进程位于不同的进程组中。
默认情况下,程序由SIGSEGV终止。默认情况下,调用该程序的shell将报告该程序已被SIGSEGV终止。这通常被称为" segfaulting",但如上所述,它可能不是真正的程序错误的结果。
如果您希望程序执行其他操作,则必须使用信号处理程序捕获信号SIGSEGV;例如,如果在程序终止之前需要进行一些清理。大多数shell(和数据库)都这样做,但在用户代码中很少需要。
注意: Linux上的信号11为SIGSEGV
,但无法保证SIGSEGV
将在不同的操作系统上显示信号11(或者甚至在某些未来的版本中Linux的)。您应始终使用信号的名称而不是数字。