#include#include#include#include#include#includevoidsigfunc(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,没有被调度过么?请大神们帮解答一下!!!
2 回答

慕标5832272
TA贡献1966条经验 获得超4个赞
我感觉内存越界的检查(或者说信号被发送)是在函数完成后才进行的,也就是调用函数的堆栈检查。补充一个例子比较能说明问题: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()
添加回答
举报
0/150
提交
取消