#include <sys/mman.h> int mprotect(const void *addr, size_t len, int prot);
prot는 다음 값들의 비트 OR이다:
새로 설정한 보호 모드는 기존의 보호 모드를 대체한다. 예를 들어, 이전에 메모리가 PROT_READ로 표시되어 있는데, mprotect가 prot를 PROT_WRITE로 호출된다면, 그 영역은 더 이상 읽기 전용이 아니다.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>
#include <limits.h> /* PAGESIZE 때문에 */
#ifndef PAGESIZE
#define PAGESIZE 4096
#endif
int
main(void)
{
char *p;
char c;
/* 버퍼를 할당한다; 기본적으로 PROT_READ|PROT_WRITE
보호 모드로 설정된다. */
p = malloc(1024+PAGESIZE-1);
if (!p) {
perror("Couldn't malloc(1024)");
exit(errno);
}
/* PAGESIZE의 배수가 되도록 정렬; 2의 제곱으로 가정한다. */
p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));
c = p[666]; /* 읽기; ok */
p[666] = 42; /* 쓰기; ok */
/* 버퍼를 읽기 전용으로 한다. */
if (mprotect(p, 1024, PROT_READ)) {
perror("Couldn't mprotect");
exit(errno);
}
c = p[666]; /* 읽기; ok */
p[666] = 42; /* 쓰기; 프로그램은 SIGSEGV로 죽는다. */
exit(0);
}