Поведение PROT_READ и PROT_WRITE с помощью mprotect

Я пытался использоватьmprotect против чтения сначала, а потом писать.

Здесь мой код

#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    int pagesize = sysconf(_SC_PAGE_SIZE);
    int *a;
    if (posix_memalign((void**)&a, pagesize, sizeof(int)) != 0)
        perror("memalign");

    *a = 42;
    if (mprotect(a, pagesize, PROT_WRITE) == -1) /* Resp. PROT_READ */
        perror("mprotect");

    printf("a = %d\n", *a);
    *a = 24;
    printf("a = %d\n", *a);
    free (a);
    return 0;
}

Под Linux вот результаты:

Вот вывод дляPROT_WRITE:

$ ./main 
a = 42
a = 24

и дляPROT_READ

$ ./main 
a = 42
Segmentation fault

Под Mac OS X 10.7:

Вот вывод дляPROT_WRITE:

$ ./main 
a = 42
a = 24

и дляPROT_READ

$ ./main 
[1] 2878 bus error ./main

Пока я понимаю, что поведение OSX / Linux может отличаться, но я не понимаю, почемуPROT_WRITE не вылетает программа при чтении значения сprintf.

Может кто-нибудь объяснить эту часть?

Ответы на вопрос(2)

Ваш ответ на вопрос