2011-08-08 18 views
5

मैंने एमएमएपी का उपयोग करके कोड आवंटित किया है, लेकिन सेगमेंटेशन गलती के कारण इसे मुक्त करने में असमर्थ है। मैंने 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

मनमैप फ़ंक्शन का उपयोग अपने सिंटेक्स का है "int munmap (शून्य * addr, size_t len);" –

+0

धन्यवाद, हाँ मैंने उपयोग किया है और यह काम कर रहा है :) – kingsmasher1

उत्तर

14

इसके लिए आपको munmap का उपयोग करने की आवश्यकता है। आपको कुछ और करने की आवश्यकता नहीं है (सुरक्षा बिट्स इत्यादि बदलें)। लेकिन आपको munmap का रिटर्न कोड देखना चाहिए।

munmap(allocation, 5000); 

free(3) केवल मुक्त स्मृति malloc(3) के माध्यम से आवंटित किया जा सकता है।

+0

यदि मैं munmap का उपयोग करता हूं, तो अंतिम 2 पंक्तियां, mprotect - PROT_WRITE की भी आवश्यकता नहीं है, है ना? मेरा मतलब है कि सुरक्षित स्मृति पर मुनैप किया जा सकता है? – kingsmasher1

+0

@ kingsmasher1 निश्चित रूप से आप कर सकते हैं। – cnicutar

+0

आपको बहुत बहुत धन्यवाद। – kingsmasher1

संबंधित मुद्दे