MINHERIT(2)

명칭
minherit - 페이지의 계승을 제어한다

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/mman.h> int minherit(void *addr, size_t len, int inherit)

해설
minherit() 시스템 콜은, 지정의 페이지가 계승때의 특성으로서 inherit (을)를 가지도록(듯이) 변경합니다. 모든 실장에 대해, 계승때의 특성이 페이지 단위로 설정할 수 있는 것이 프로텍션되는이라고 있는 것은 아닙니다. 변경의 단위는 리젼 전체일지도 모릅니다. FreeBSD (은)는, 페이지마다 계승 특성을 조정하는 기능을 가집니다. 계승은, fork() 그리고 작성된 아이 에 대해서만 영향을 줍니다. exec() 에는 영향 없습니다. exec 된 프로세스는, address 공간 전체를 옮겨놓습니다. 이 함수는 부모의 address 공간에 대해서도 또한 영향 없습니다 (부모와 자식에 의한 address 공간의 공유는 잠재적으로 있습니다만, 이것은 제외합니다).

계승은 난해한 기능이며, 대부분이 mmap() 의 MAP_SHARED 기능으로 옮겨놓을 수 있고 있습니다. 그렇지만, minherit() (을)를 사용해, MAP_PRIVATE 그리고 MAP 된 메모리브록크를 부모와 자식 사이에 공유 가능합니다. 이것에 의해, 부모 혹은 아이에 의한 수정은 공유됩니다만, 원래 하층에 있는 파일은 변경되지 않습니다.

INHERIT_SHARE
    본옵션은, 대상의 address 공간을 부모와 자식 사이에 공유시킵니다. 본옵션은, 원래 하층에 있는 배킹 스토어가 어떻게 MAP 되려면 , 영향을 주지 않습니다.

INHERIT_NONE
    본옵션은, 대상의 address 공간의 계승을 완전하게 방지합니다. 해당 address 공간은 아이중에서는 안 MAP 됩니다.

INHERIT_COPY
    본옵션은, address 공간을 아이에 대해 카피 온 라이트로 계승시킵니다. 본옵션에는 불행한 부작용이 있어, 부모가 fork 할 경우에 address 공간이 카피 온 라이트가 되어 버립니다. 원래의 매핑이 MAP_SHARED 의 경우, 부모가 fork 한 후에는 이것은 부모에 있어 공유되지 않습니다. 또, 원의 공유 배킹 스토어 매핑은, 부모에 있어 안 MAP 해 재MAP 하는 것 외에 회복할 방법이 없습니다.

반환값

에러
minherit() 함수는 다음의 경우에 처리를 실패합니다.

[EINVAL]
    addr 인수와 len 인수에 의해 지정되는 가상 주소 범위가 유효하지는 않습니다.

[EACCES]
    inherit 인수에 의해 지정되는 플래그가, addr 인수와 len 인수에 의해 지정된 페이지에 대해서 적절하지는 않았습니다.

관련 항목
fork(2), madvise(2), mincore(2), mprotect(2), msync(2), munmap(2), rfork(2)

역사
minherit() 함수는 OpenBSD 그리고 처음 등장했습니다.