为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

长风秋雁 2019-04-08 11:19:24
#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()
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 504 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号