SIGSEGV默认处理程序在进程终止之前是否清除堆栈/堆内存?

时间:2012-10-16 05:28:15

标签: linux signals sigsegv

我在一个简单的C程序中声明了两个变量(一个全局和另一个本地),除了两个具有不同大小数据的数组。在进行strcpy()调用之前,我使用return 0;例程导致缓冲区溢出。我在终端屏幕上看到分段错误错误。

我知道在收到此SIGSEGV信号后,系统会获取进程内存的核心转储并终止该进程,但是系统会清理(清零)堆栈/堆内存和其他部分,例如BSS细分,文本细分等?

我想,在正常终止进程时,系统会清理(清零)内存,但我不太确定。

我正在使用Ubunutu 10.12gcc来运行该程序。

1 个答案:

答案 0 :(得分:3)

当Linux process终止时(正常情况下,通过调用_exit syscall,例如从main返回,或通过SIGSEGV之类的信号),address space不再存在。

实际上,内核不会将前一个进程的内存归零,它只是将相关页面添加到某些空闲页面集合中,稍后将重用这些页面。重复使用页面时,它会清除它或用适当的内容填充它。所有这些都发生在内核中,应用程序只看到适当填充(或清除)的页面。

您应该阅读有关virtual memory的更多信息,并邀请您阅读一些好的advanced unix programmingadvanced linux programming本书。

进程只能查看虚拟内存,它们的地址空间是通过execve(2)系统调用设置的,并且可以更改,例如与mmap(2)系统调用。