Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当堆栈内存被填满时(因此存在堆栈溢出),程序如何知道发出SegFault发生的信号(操作系统?)?_C_Segmentation Fault_Kernel - Fatal编程技术网

C 当堆栈内存被填满时(因此存在堆栈溢出),程序如何知道发出SegFault发生的信号(操作系统?)?

C 当堆栈内存被填满时(因此存在堆栈溢出),程序如何知道发出SegFault发生的信号(操作系统?)?,c,segmentation-fault,kernel,C,Segmentation Fault,Kernel,底线问题:当C程序(例如无限递归或调用自身的函数,如main)中的堆栈内存已满(因此存在堆栈溢出)时,程序如何知道发出信号或输出已发生分段错误?会是操作系统吗 推论问题-操作系统和内核之间有什么区别(或者同一事物的术语不同?) (额外)背景资料 有许多很酷的小C代码片段示例会导致堆栈溢出,例如 int main() { main(); } 我能够使用gdb和命令run、break、run、和info frame直接查看堆栈“向下”填充的地址(“递减”地址) 我还看到了这个问题

底线问题:当C程序(例如无限递归或调用自身的函数,如
main
)中的堆栈内存已满(因此存在堆栈溢出)时,程序如何知道发出信号或输出已发生
分段错误
?会是操作系统吗

  • 推论问题-操作系统和内核之间有什么区别(或者同一事物的术语不同?)
(额外)背景资料 有许多很酷的小C代码片段示例会导致堆栈溢出,例如

 int main() {
   main();
 }  
我能够使用
gdb
和命令
run
break
run
、和
info frame
直接查看堆栈“向下”填充的地址(“递减”地址)


我还看到了这个问题,在这个问题中,内核向SIGSEGV发送信号。答案是“内核”(但实际上操作系统)不知道,它只是一遍又一遍地运行代码,“信号处理程序”负责发送SEGFULT信号。这是设置“信号处理程序”的操作系统吗?谁能发出堆栈溢出的信号,谁能发送分段故障信号

对于推论问题,有时这两个术语可以互换使用,但在我看来,“内核”只是介于硬件和实际操作系统之间的实际内核,它处理进程、内存和设备驱动程序。“操作系统”(或OS)是内核加上用户与之交互的所有工具、实用程序、外壳和用户界面。对于底线问题,在现代分段和受保护的操作系统(如Linux、Windows或macOS)上,是内核为进程设置分段和虚拟内存表,而页面之外的访问可能会导致分段错误。如果你想了解更多的细节,你可能想对虚拟内存、分段和分页做更多的研究。@Someprogrammerdude谢谢,在研究方面,我正在通过-Zed A.Shaw进行研究。通过艰苦的方式学习C(非常好的C示例),以及-Randall Hyde。写伟大的代码,第2卷:低层次思考,高层次写作。来自其他stackoverflow问题的建议,他们对C内存布局有很好的解释。希望这两种资源能够帮助其他人。感谢您澄清“内核”与操作系统之争。回到底线Q,我想/猜测虚拟mem表会设置溢出条件;它是如何发回这个信号的?我不知道所有不同的情况是如何处理的,但我相当确定递归深度有一个限制,当达到这个限制时会导致seg错误。对于推论问题,有时这两个术语可以互换使用,但在我看来是“内核”只是位于硬件和实际操作系统之间的实际内核,它处理进程、内存和设备驱动程序。“操作系统”(或OS)是内核加上用户与之交互的所有工具、实用程序、外壳和用户界面。对于底线问题,在现代分段和受保护的操作系统(如Linux、Windows或macOS)上,是内核为进程设置分段和虚拟内存表,而页面之外的访问可能会导致分段错误。如果你想了解更多的细节,你可能想对虚拟内存、分段和分页做更多的研究。@Someprogrammerdude谢谢,在研究方面,我正在通过-Zed A.Shaw进行研究。通过艰苦的方式学习C(非常好的C示例),以及-Randall Hyde。写伟大的代码,第2卷:低层次思考,高层次写作。来自其他stackoverflow问题的建议,他们对C内存布局有很好的解释。希望这两种资源能够帮助其他人。感谢您澄清“内核”与操作系统之争。回到底线Q,我想/猜测虚拟mem表会设置溢出条件;它是如何发回这个信号的?我不知道所有不同的情况是如何处理的,但我相当确定,当达到递归深度限制时,会导致seg故障