2011-08-08 12 views
5

Mam przydzielony kod za pomocą mmap, ale nie można go zwolnić z powodu błędu segmentacji. Zrobiłem mprotect - PROT_WRITE, aby było możliwe do zapisu, ale nadal nie mogę go zwolnić.Jak zwolnić pamięć za pomocą mmap?

Proszę, pomóż mi.

enter code here 
1 #include <stdio.h> 
2 #include <memory.h> 
3 #include <stdlib.h> 
4 #include <unistd.h> 
5 #include <sys/mman.h> 
6 #include <sys/types.h> 
7 #include <fcntl.h> 
8 
9 int main() 
10 { 
11 void * allocation; 
12 size_t size; 
13 static int devZerofd = -1; 
14 
15 if (devZerofd == -1) { 
16     devZerofd = open("/dev/zero", O_RDWR); 
17     if (devZerofd < 0) 
18       perror("open() on /dev/zero failed"); 
19 } 
20 
21 allocation = (caddr_t) mmap(0, 5000, PROT_READ|PROT_NONE, MAP_PRIVATE, devZerofd, 0); 
22 
23 if (allocation == (caddr_t)-1) 
24     fprintf(stderr, "mmap() failed "); 
25 
26 if (mprotect((caddr_t)allocation, 5000, PROT_WRITE) < 0) 
27   fprintf(stderr, "mprotect failed"); 
28 else 
29   printf("mprotect done: memory allocated at address %u\n",allocation); 
30 
31 strcpy(allocation,"Hello, how are you"); 
32 puts(allocation); 
33 
34 if (mprotect((caddr_t)allocation, 5000, PROT_WRITE) < 0) 
35   fprintf(stderr, "mprotect failed"); 
36 
37 free(allocation); 
38 
39 } 
40 
41 
+0

użyj funkcji munmap jej syntex to "int munmap (void * addr, size_t len);" –

+0

Dziękuję, tak, mam zastosowanie i działa :) – kingsmasher1

Odpowiedz

14

Do tego celu należy użyć munmap. Nie musisz robić nic więcej (zmieniać bity ochrony itp.). Ale powinieneś sprawdzić kod powrotu munmap.

munmap(allocation, 5000); 

free(3) mogą być wykorzystywane wyłącznie w celu zwolnienia pamięci przydzielonej przez malloc(3).

+0

Jeśli używam munmap, ostatnie 2 wiersze, mprotect - PROT_WRITE również nie są potrzebne, prawda? Mam na myśli, czy munmap można zrobić na chronionej pamięci? – kingsmasher1

+0

@ Kingsmasher1 Pewnie, że możesz. – cnicutar

+0

Dziękuję bardzo. – kingsmasher1

Powiązane problemy