linux有没有测试内存可读写的函数。

kkk2017 2013-09-09 08:13:03
LINUX C语言没有try catch吗?
我有一段代码,可能内存不能读,会出错,没有try catch怎么防止这种错误呢?

WINDOWS上有IsBadReadPtr和IsBadWritePtr函数测试内存的可读可写?LINUX有类式的函数吗?
...全文
425 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
juliantec 2013-09-10
  • 打赏
  • 举报
回复
有意思的问题 在linux里面,如果去访问你无权访问的内存地址,你就会收到 SIGSEGV 信号而陷入段错误(默认处理为结束进程的继续执行)。 所以,如果你想侦测内存读写权限问题,那你就可以想办法去catch 这个 信号,做进一步的处理。
juliantec 2013-09-10
  • 打赏
  • 举报
回复
不应该吧,我想有两点可以确定: a,某一线程在访问内存违例时候触发的 SIGSEGV 信号只会被这个线程本身收到, 另外的线程是不会收到的。 b,如果想要让函数isbadptr线程安全,那估计需要给每一个线程都准备一份jmp_buf, 或者将之放在TLS内部。 longjmp 的时候挑自己对应的那个用。
kkk2017 2013-09-10
  • 打赏
  • 举报
回复
用了SIGSEGV信号+setjmp的方法来测试可读写,但总觉得有问题。 #include <setjmp.h> #include <signal.h> jmp_buf jmpbuf; void sigsegv(int sign) { signal(sign,SIG_DFL); longjmp(jmpbuf,1); } bool isbadptr(void*ptr,int size) { int i; signal(SIGSEGV,sigsegv); i=setjmp(jmpbuf); if(i==0) { for(i=0;i<size;i++) { *((char*)ptr+i)=*((char*)ptr+i); } } else if(i==1) { return 0; } return 1; } int main(int argc, char** argv) { int eax; if((eax=isbadptr((void*)1000,100))==0) printf("error ptr eax=0"); return (EXIT_SUCCESS); } 用了SIGSEGV信号+setjmp的方法来测试可读写,但总觉得有问题。各位大侠指教。 比如开了两个线程A,线程B, 线程A里调用isbadptr来测试内存读写,isbadptr里调用signal安装了信号处理SIGSEGV,并且setjmp,并且读写内存。 这时候切换到线程B执行,线程B里出现了读写内存错误,发生了SIGSEGV信号,由于之前线程A里调用isbadptr里调用signal安装了信号处理SIGSEGV。这时候线程B走进sigsegv处理函数,调用longjmp跳转到原来线程A的setjmp,最终导致整个逻辑错误。

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧