Manpages

이 름

mprotect − 메 모 리 영 역 에 대 한 접 근 를 제 어 한 다 .

사 용 법

#include <sys/mman.h>

int mprotect(const void *addr, size_t len, int prot);

설 명

mprotect는 메 모 리 영 역 에 대 한 접 근 을 제 어 한 다 . 만 일 그 영 역 을 보 호 하 기 위 해 접 근 이 허 용 되 지 않 는 다 면 , 프 로 그 램 은 SIGSEGV를 받 는 다 .

prot는 다 음 값 들 의 비 트 OR이 다 :

PROT_NONE

메 모 리 를 접 근 할 수 없 다 .

PROT_READ

메 모 리 를 읽 을 수 있 다 .

PROT_WRITE

메 모 리 를 쓸 수 있 다 .

PROT_EXEC

메 모 리 에 실 행 코 드 를 둘 수 있 다 .

새 로 설 정 한 보 호 모 드 는 기 존 의 보 호 모 드 를 대 체 한 다 . 예 를 들 어 , 이 전 에 메 모 리 가 PROT_READ로 표 시 되 어 있 는 데 , mprotectprotPROT_WRITE로 호 출 된 다 면 , 그 영 역 은 더 이 상 읽 기 전 용 이 아 니 다 .

반 환 값

성 공 시 , mprotect는 0을 리 턴 한 다 . 에 러 시 , −1이 리 턴 되 며 , errno는 적 당 한 값 으 로 설 정 된 다 .

에 러

EINVAL

addr가 유 효 한 포 인 터 가 아 니 거 나 , 또 는 PAGESIZE의 배 수 가 아 니 다 .

EFAULT

메 모 리 를 접 근 할 수 없 다 .

EACCES

메 모 리 가 지 정 된 모 드 로 설 정 될 수 없 다 . 예 를 들 어 , 읽 기 전 용 접 근 을 하 도 록 파 일 을 mmap(2) 했 는 데 mprotectPROT_WRITE를 요 청 할 때 발 생 한 다 .

ENOMEM

내 부 커 널 구 조 체 를 할 당 할 수 없 다 .

예 제

#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);
}

호 환

SVr4, POSIX.1b (공 식 적 으 로 POSIX.4). SVr4는 EAGAIN 에 러 코 드 을 추 가 적 으 로 정 의 한 다 . SVr4 에 러 조 건 은 리 눅 스 와 정 확 히 대 응 되 지 는 않 는 다 . POSIX.1b에 서 는 mprotectmmap(2)으 로 확 보 한 메 모 리 영 역 에 서 만 사 용 될 수 있 다 고 말 한 다 .

관 련 항 목

mmap(2)

역 자

정 강 훈 <skyeyes [AT] soback.net>, 2000년 5월 15일