分段故障(SIGSEGV)与总线错误(SIGBUS)

分段故障(SIGSEGV) 总线错误(SIGBUS) 是当操作系统检测到严重的程序错误,并且由于这些错误程序无法继续执行时产生的信号。 1) 分段故障 (也称为SIGSEGV,通常是信号11)发生在程序试图在分配给它的内存之外写入/读取时,或在写入只能读取的内存时。换句话说,当程序试图访问它无法访问的内存时。SIGSEGV是“分段冲突”的缩写。 产生SIGSEGV信号的少数情况如下:, ->使用未初始化的指针 ->取消引用空指针 ->试图访问程序不拥有的内存(例如,试图访问数组元素) 超出数组边界)。 ->尝试访问已取消分配的内存(尝试使用悬挂指针)。 请参考 文章举例。 2) 总线错误 (也称为SIGBUS,通常是信号10)在进程试图访问CPU无法物理寻址的内存时发生。换句话说,程序试图访问的内存不是有效的内存地址。这是由于CPU的对齐问题造成的(例如,试图从不是4的倍数的地址中读取长字符)。SIGBUS是“总线错误”的缩写。 SIGBUS信号出现在以下情况下, ->程序指示CPU读取或写入无效的特定物理内存地址/整个计算机系统无法识别请求的物理地址。 ->未对齐的内存访问(例如,如果多字节访问必须是16位对齐的,则0、2、4、6等处的地址(以字节为单位)将被视为对齐,因此可以访问,而地址1、3、5等将被视为未对齐。) 主要区别 在分段错误和总线错误之间,分段错误表示对有效内存的访问无效,而总线错误表示对无效地址的访问。 下面是一个总线错误的例子 维基百科 .

null

C

// C program to demonstrate Bus Error
#include <stdlib.h>
int main( int argc, char **argv)
{
#if defined(__GNUC__)
# if defined(__i386__)
/* Enable Alignment Checking on x86 */
__asm__("pushforl $0x40000,(%esp)popf");
# elif defined(__x86_64__)
/* Enable Alignment Checking on x86_64 */
__asm__("pushforl $0x40000,(%rsp)popf");
# endif
#endif
/* malloc() always provides aligned memory */
char *cptr = malloc ( sizeof ( int ) + 1);
/* Increment the pointer by one, making it
misaligned */
int *iptr = ( int *) ++cptr;
/* Dereference it as an int pointer, causing
an unaligned access */
*iptr = 42;
/* Following accesses will also result in
sigbus error.
short *sptr;
int    i;
sptr = (short *)&i;
// For all odd value increments, it will
// result in sigbus.
sptr = (short *)(((char *)sptr) + 1);
*sptr = 100;    */
return 0;
}


输出:

Bad memory access (SIGBUS) 

本文由 普拉尚斯·潘格拉 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享