2014-04-01 2 views
2

mmap 및 munmap에 관한 간단한 질문이 있습니다. mmap이 성공했지만 munmap이 실패 할 수 있습니까?munmap의 Linux 오류

모든 매개 변수가 올바르게 지정되었다고 가정합니다. 예를 들어 다음 코드 조각을 참조하십시오. 어떤 상황에서 munmap failed!이 인쇄됩니까 ??

char *addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 

... exit if mmap was not successful ... 
... do some stuff using mmaped area ... 

if(munmap(addr, 4096) == -1){ 
    printf("munmap failed!\n"); 
} 

답변

2

예, 실패 할 수 있습니다. mmunmap man pages :

성공적으로 완료되면 munmap()은 0을 반환하고 그렇지 않으면 0을 반환합니다. 그렇지 않으면 -1을 반환하고 errno를 설정하여 오류를 나타냅니다.

오류 코드는 사람들이 잘못된 매개 변수를 전달 함을 나타냅니다. 그러나 mmap()에서 얻은 포인터를 전달하고 올바른 크기를 지정하면 실패하지 않습니다.

가정의 모든 매개 변수가 올바르게

은 다음 그것은 실패하지 않습니다, 주어진다. 이것이 대부분의 구현 (99 %)이 unmmap()의 반환 값을 확인하지 않는 이유입니다. 이 경우 실패하더라도 아무 것도 할 수 없습니다 (사용자에게 알리는 것 외에는).

+0

불행히도 Linux의 munmap() _can_은 모든 매개 변수가 유효하고 매핑을 절반으로 분할하지 않은 경우에도 실패합니다. 예를 들어 http://stackoverflow.com/questions/43743555/munmap-failure-with-enomem-with-private-anonymous-mapping을 참조하십시오. – Ivan

0

munmap은 잘못된 매개 변수를 받으면 EINVAL으로 실패 할 수 있습니다.

프로세스의 최대 매핑 수를 초과하면 ENOMEM으로 실패 할 수도 있습니다. 이는 기존지도의 중간에있는 지역의지도를 지우려고하면 두 개의 작은지도가 표시 될 때 발생할 수 있습니다. 당신은 예를 들어, 그것을 증가시킬 수

sysctl vm.max_map_count 

:

sysctl -w vm.max_map_count=131060 

당신이 'munmap을 확인하지 않는 경우 경고 될

당신과 프로세스 당 매핑의 최대 수를 볼 수 있습니다 오류가 발생할 수있는 장기 실행 프로세스에서 충돌이나 다른 종류의 오류를 유발할 수있는 단서는 없습니다.

예를 들어 munmap EINVAL은 메모리 누수를 가리킬 수 있습니다.

또한 mmapMAP_FAILED으로, 즉 (void*)-1이 아니고 NULL이 아닙니다.