MPROTECT

Section: 리눅스 프로그래머 매뉴얼 (2)
Updated: 1997년 05월 31일
Index
Return to Main Contents
 

이름

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로 표시되어 있는데, mprotect가 prot를 PROT_WRITE로 호출된다면, 그 영역은 더 이상 읽기 전용이 아니다.  

반환값

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

에러

EINVAL
addr가 유효한 포인터가 아니거나, 또는 PAGESIZE의 배수가 아니다.
EFAULT
메모리를 접근할 수 없다.
EACCES
메모리가 지정된 모드로 설정될 수 없다. 예를 들어, 읽기 전용 접근을 하도록 파일을 mmap(2) 했는데 mprotect가 PROT_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에서는 mprotect는 mmap(2)으로 확보한 메모리 영역에서만 사용될 수 있다고 말한다.  

관련 항목

mmap(2)  

역자

정강훈 <skyeyes@soback.kornet.net>, 2000년 5월 15일


 

Index

이름
사용법
설명
반환값
에러
예제
호환
관련 항목
역자

This document was created by man2html, using the manual pages.
Time: 08:07:00 GMT, March 25, 2004