2016-10-19 3 views
6

시스템 호출로 수행되고 구조체 *에 메모리를 할당해야하는 연습을 완료하려고합니다. 내 코드는 다음과 같습니다 명확히하기 위해malloc() 대신 mmap() 사용

myStruct * entry = (myStruct *)mmap(0, SIZEOF(myStruct), PROT_READ|PROT_WRITE, 
MAP_ANONYMOUS, -1, 0); 

, 내가 malloc()을 사용할 수 있지만 mmap()를 사용할 수 있습니다. Netbeans의 Windows에서이 문제가 발생하지 않았지만, 현재 우분투의 명령 줄에서 컴파일 및 실행 중이므로 액세스 할 때마다 "Segmentation Fault"가 발생합니다.

하나가 아닌 다른 시스템에서 작동하는 이유가 있습니까? mmap()이 방법으로 메모리를 할당하는 올바른 방법은 무엇입니까? 내 걱정은 각 mmap() 콜에 대해 큰 메모리 덩어리를 할당하려고했기 때문에 지금은 실행할 수 없습니다.

또한 오류가 내 mmap은 22 - 잘못된 인수입니다 (위의 코드에서 오류 검사를 수행하지 않도록 질문을 작성하는 동안 문제가 발생했습니다). 주소가 0이고 사용자 정의 SIZEOF() 함수가 다른 mmap 인수에서 작동하는 경우 MAP_ANONYMOUS을 사용하므로 fdoffset 매개 변수는 각각 -1과 0이어야합니다.

PROT_READ|PROT_WRITE 섹션에 문제가 있습니까?

+2

'4096'이나'8192' 또는'SIZEOF (myStruct)'대신에 2의 다른 힘을 사용한다면, 그것은 자연스러운 추측일까요? –

+1

나는 그 오류가 당신의'SIZEOF()'에 있다고 생각한다.'MAP PRIVATE'를 추가해야합니다. –

+0

'SIZEOF()'가 정확하지 않습니다. 실제 아이템의 철자는'sizeof()'I.E.입니다. 모두 소문자. – user3629249

답변

6

플래그에 MAP_PRIVATE를 지정해야합니다. manual page 가입일

myStruct * entry = (myStruct *)mmap(0, SIZEOF(myStruct), 
     PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 

:

플래그 인수는 매핑에 대한 업데이트와 동일한 영역을 맵핑하는 다른 프로세스에게 표시 여부 및 업데이트 기본 파일을 수행할지 여부를 결정

.

당신은 정확하게 플래그 중 하나가 MAP_PRIVATE 또는 MAP_SHARED 필요 -하지만 당신은 그들 중 하나를 포기하지 않았다 :이 문제는 플래그에서 다음 값 중 단 하나의 포함 에 의해 결정된다.

완전한 예 :.

#include <sys/mman.h> 
#include <stdio.h> 

typedef struct 
{ 
    int a; 
    int b; 
} myStruct; 

int main() 
{ 
    myStruct * entry = (myStruct *)mmap(0, sizeof(myStruct), 
      PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 

    if (entry == MAP_FAILED) { 
     printf("Map failed.\n"); 
    } 
    else { 
     entry->a = 4; 
     printf("Success: entry=%p, entry->a = %d\n", entry, entry->a); 
    } 
    return 0; 
} 

합니다 (당신이 MCVE로 제공했을 수 있습니다 무엇의 좋은 예 이것은 다른 사람이 당신을 도울 훨씬 더 쉽게 만드는 위, 물론 MAP_PRIVATE하지 않고있다, 그들은 당신이 한 것을 정확하게 볼 수 있고 제안 된 해결책을 테스트 할 수 있기 때문에 항상 MCVE를 제공해야합니다.)

+0

이것은 그 것이었다, 나는 설명서를 잘못 읽었다! MAP_PRIVATE로 시작하여 MAP_ANONYMOUS로 이동했습니다. 둘 다 필요합니다 ... 고마워요. –

3

mmap()의 설명서 페이지에는 flags 인수에 MAP_SHAREDMAP_PRIVATE 중 하나를 정확히 지정해야한다고 나와 있습니다. 귀하의 경우, malloc()처럼 행동, 당신은 MAP_PRIVATE 할 것입니다 :

myStruct *entry = mmap(0, sizeof *entry, 
         PROT_READ|PROT_WRITE, 
         MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 

(나는 또한 유해 캐스트를 생략하고 그 형태가 아닌 실제 변수에 sizeof 일치하여 더 관용적 C를했습니다) .

+0

고마워요! 내 독서 기술에 익숙해 져야합니다. –