当前位置:  技术问答>linux和unix

请教关于SIGSEGV信号的问题

    来源: 互联网  发布时间:2016-11-25

    本文导语:  该程序演示越权访问一个内存映射区。首先创建一个只读的内存映射区,之后对其进行写操作。该越权访问造成程序收到SIGSEGV信号。应用程序接收该信号,并输出提示信息不能关切输出提示信息。接下来程序调用mprot...

该程序演示越权访问一个内存映射区。首先创建一个只读的内存映射区,之后对其进行写操作。该越权访问造成程序收到SIGSEGV信号。应用程序接收该信号,并输出提示信息不能关切输出提示信息。接下来程序调用mprotect函数改变映射区的访问权限为可读写。此时,再次向映射区进行写操作就可以成功了。(这是程序本意)
程序源代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

void sig_segv(int signo);

jmp_buf jmpbuffer;

/*void handler(int signo)
{
printf("permission deniedn");
}*/

int main(void)
{
int fd;
char *buf;
struct stat statbuf;

/*if(setjmp(jmpbuffer) != 0)
{
printf("permission deniedn");
}*/

/* if((signal(SIGSEGV, handler)) == SIG_ERR)
{
printf("can't set handler for SIGALRM");
exit(0);
}*/

if((signal(SIGSEGV, sig_segv)) == SIG_ERR)  //设置SIGSEGV信号处理程序
{
printf("can't set handler for SIGALRM");
exit(0);
}

if(stat("test.txt", &statbuf) == -1)  //得到文件状态信息
{
perror("fail to get stat");
exit(1);
}

fd = open("test.txt", O_RDWR); //以读写方式打开文件
if(fd == -1)
{
perror("fail to open");
exit(1);
}

buf = (char *)mmap(NULL,statbuf.st_size,PROT_READ,MAP_SHARED,fd,0);  //建立内存映射区,访问权限为只读
if(buf == MAP_FAILED)
{
perror("fail to mmap");
exit(1);
}

if(setjmp(jmpbuffer) != 0)
{
printf("permission deniedn");
}

printf("try to writen");
memcpy(buf, "chinan", 6); // 企图写一个只读的映射区,造成SIGSEGV错误

/*if(setjmp(jmpbuffer) != 0)
{
printf("permission deniedn");
}*/

if(mprotect(buf, statbuf.st_size, PROT_READ|PROT_WRITE)==-1) //改变内存映射区访问权限
{
perror("fail to alter permission");
exit(1);
}

printf("write againn");
memcpy(buf, "chinan", 6); //再次写内存映射区

if(munmap(buf, statbuf.st_size) == -1) //撤销内存映射
{
perror("fail to munmap");
exit(1);
}

close(fd);

return 0;
}

void sig_segv(int signo)
{
longjmp(jmpbuffer, 1);
}

当程序捕捉到SIGSEGV信号时,本意是希望捕获信号输出提示信息后,程序能继续运行。但是,中断返回点仍旧在非法访问处,如此则进入一个“非法访问--信号--处理--非法访问”的死循环中。本想借用setjmp和longjmp解决,奈何setjmp必须在调用longjmp之前调用,以确定jmpbuffer的值。所以,用了,跟没用一样。返回setjmp后,还是同样进入死循环。

我已经没办法了,望高手指点一二,感激不尽!

|
把mprotect(...)的调用放在信号处理函数中
需要把buf及struct stat statbuf定义为全局变量

|
SIGSEGV信号不只是发一次,会一直发发到你的程序结束哦。

    
 
 

您可能感兴趣的文章:

  • 请教:多线程模式下的信号处理问题
  • 请教信号量处理函数signal的问题?
  • 请教 gtk编程,nootbook控件切换标签时信号量处理的问题
  • linux编程中简单的信号处理问题,请教各位,谢谢。
  • 请教一个关于UNIX下信号量的问题
  • 信号方面的问题请教.请大家指点
  • 初学,请教一个信号问题,这个方法不理解
  • 请教一段代码的意思,信号和超时的
  • 请教关于Kill向子进程发送信号的问题,子进程如何相应信号,为什么子进程接受不到。
  • [请教内核高手]内核在何处处理接收到的信号
  • 请教一个有关信号的问题
  • 还是不懂,驱动到底如何能同步的发送信号给用户程序,请教高人,谢谢了
  • 小白请教关于Listen、accept、信号处理函数、waitpid的几个问题
  • 请教信号发送程序遇到的一个问题
  • 请教使用sem_unlink删除信号量的问题
  • 请教信号难题
  • Linux内核信号量和定时器问题请教:
  • 用信号量同步出错,请教高手。。。
  • Linux下C编程问题:段错误,Program received signal SIGSEGV, Segmentation fault.请教各位!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    HTML标签参考手册 iis7站长之家