2011-08-08 11 views
5

私はmmapを使ってコードを割り当てましたが、セグメント化エラーのためにコードを解放できませんでした。私はmprotect - PROT_WRITEを書き込み可能にしましたが、まだそれを解放することはできません。mmapを使って割り当てられたメモリを解放するには?

私を助けてください。

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

munmap関数を使用するその構文は "int munmap(void * addr、size_t len);"です。 –

+0

ありがとう、はい私は使用していると働いています:) – kingsmasher1

答えて

14

munmapを使用する必要があります。他に何もする必要はありません(保護ビットの変更など)。しかし、戻りコードmunmapを確認する必要があります。

munmap(allocation, 5000); 

free(3)のみmalloc(3)介して割り当てられたメモリを解放するために使用することができます。

+0

私はmunmap、最後の2行、mprotect - PROT_WRITEも、必要はありません、右ですか?私はmunmapを保護されたメモリ上で行うことができますか? – kingsmasher1

+0

@ kingsmasher1もちろんできます。 – cnicutar

+0

ありがとうございました。 – kingsmasher1

関連する問題