#include#include #include #include #include #include #include #include #include char* buf;struct stat statbuf;void handler(int signo){ printf("permission denied\n"); if (mprotect(buf, statbuf.st_size, PROT_READ|PROT_WRITE) == -1) { perror("failed to alter permission"); exit(1); } printf("permission modified\n");}int main(){ int fd; if (signal(SIGSEGV, handler) == SIG_ERR) { printf("can not set handler for SIGSEGV.\n"); exit(0); } if (stat("test.txt", &statbuf) == -1) { perror("failed to get stat"); exit(1); } fd = open("test.txt", O_RDWR); if (fd == -1) { perror("failed to open file\n"); exit(1); } buf = (char*)mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0); // readonly memory map printf("try to write to a readonly memccpy map\n"); memcpy(buf, "china\n", 6); if (munmap(buf, statbuf.st_size) == -1) { perror("failed to unmap\n"); exit(1); } close(fd); return 0;}