信号是在什么时候被处理的?内存越界后程序是怎么运行的呢?

#include
#include
#include
#include
#include
#include
voidsigfunc(intsig){
printf("recvasignal%d\n",sig);
abort();
}
intmain(void){
signal(SIGSEGV,sigfunc);
charsz[10]={0};
printf("cpybegin111111111\n");
strcpy(sz,"helloliwq,helloliwq,helloliwq");
printf("cpyend2222222\n");
printf("pid%d\n",getpid());
printf("ok1111111111\n");
sleep(3);
printf("ok2222222222\n");
sleep(500);
printf("ok3333333333\n");
return0;
}
不知道是和系统有关系么?在我的机器上运行到结束以后才会处理内存越界的信号。
信号是在内核态向用户态切换前处理的吧,那这段代码就没有切换到内核态运行过么,sleep了这么久,就一直占用CPU,没有被调度过么?请大神们帮解答一下!!!
长风秋雁
浏览 505回答 2
2回答

慕标5832272

我感觉内存越界的检查(或者说信号被发送)是在函数完成后才进行的,也就是调用函数的堆栈检查。补充一个例子比较能说明问题:voidsigfunc(intsig){printf("recvasignal%d\n",sig);abort();}voidtestmem(){charsz[10]={0};printf("funcpybegin11111111\n");strcpy(sz,"hellowpjsolo,hellowpjsolo,hellowpjsolo");printf("funcpyend2222222\n");}intmain(void){signal(SIGSEGV,sigfunc);charsz[10]={0};printf("cpybegin111111111\n");strcpy(sz,"helloliwq,helloliwq,helloliwq");printf("cpyend2222222\n");printf("pid%d\n",getpid());printf("ok1111111111\n");sleep(3);printf("ok2222222222\n");testmem();sleep(5);printf("ok3333333333\n");return0;}将在testmem()运行后马上就abort()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript