- 论坛徽章:
- 0
|
想到一个让用户程序忽略SIGBUS的办法,使用sigsetjmp+siglongjmp。
把之前的代码改造如下:- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <sys/mman.h>
- #include <unistd.h>
- #include <setjmp.h>
- #define FILESIZE 8192
- sigjmp_buf env;
- void handle_sigbus(int sig)
- {
- printf("SIGBUS!\n");
- siglongjmp(env, 1);
- }
- void main()
- {
- int i;
- char *p, tmp;
- int fd = open("tmp.ttt", O_RDWR);
- p = (char*)mmap(NULL,
- FILESIZE, PROT_READ|PROT_WRITE,
- MAP_SHARED, fd, 0);
- signal(SIGBUS, handle_sigbus);
- getchar();
- if (!sigsetjmp(env, 1)) {
- for (i=0; i<FILESIZE; i++) {
- tmp = p[i];
- }
- }
- else {
- printf("fault cached when i=%d\n", i);
- }
- printf("ok\n");
- }
复制代码 按照同样的流程,先执行程序、再将文件缩小、再进行内存访问。得到的输出结果如下:- kouu@kouu-one:~/test$ ./a.out
- SIGBUS!
- fault cached when i=4096
- ok
复制代码 |
|