Próbowałem użyć mprotect
do czytania najpierw, a następnie pisania.Zachowanie PROT_READ i PROT_WRITE z mprotect
Jest tu mój kod
#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;
}
Pod Linuksem oto wyniki:
Oto wyjście PROT_WRITE
:
$ ./main
a = 42
a = 24
i PROT_READ
$ ./main
a = 42
Segmentation fault
W systemie Mac OS X 10.7:
Oto wyjście PROT_WRITE
:
$ ./main
a = 42
a = 24
i PROT_READ
$ ./main
[1] 2878 bus error ./main
Dotychczas Rozumiem, że zachowanie OSX/Linux może być różny, ale nie rozumiem, dlaczego PROT_WRITE
nie powoduje awarii programu podczas odczytu wartości za pomocą printf
.
Czy ktoś może wyjaśnić tę część?
Dlaczego miałbyś oczekiwać, że 'PROT_WRITE' ulegnie awarii? – Art
ponieważ tylko z flagą 'PROT_WRITE', pamięć ma być nieczytelna AFAIK. Jeśli chcesz uzyskać dostęp rw, potrzebujesz 'PROT_WRITE | PROT_READ' flag – Mali
@ Mali right, miałoby sens jako pytanie, czy spodziewał się awarii podczas czytania w argumencie do pierwszego printf, a nie podczas nadpisywania wartości przez '* a = 24'. W każdym razie próbowałem to wszystko ująć w mojej odpowiedzi. – Art