SHMOP(2)

이름
shmop - 공유 메모리 작동들

사용법
# include <sys/types.h>
# include <sys/shm.h>

void *shmat ( int shmid, const void *shmaddr, int shmflg )

int shmdt ( const void *shmaddr)

설명
shmat 함수는 shmid 로 식별되는 공유 메모리 세그먼트를 호출 프로세스의 데이터 세그먼트에 연결한다. 연결될 주소는 다음 조건중 하나의 shmaddr 로 지정된다.

    If shmaddr 가 0 이면, 시스템은 1 - 1.5G사이의 영역에서 상위에서부터 하위로 대응되지 않은 영역을 찾는다.

    shmaddr 가 0 이 아니고 SHM_RND 가 shmflg 에 지정되어 있으면, shmaddr 가 SHMLBA 의 배수의 주소로 연결이 발생한다. 그렇지 않으면 shmaddr 는 연결할수 있는 정렬된 페이지 주소이어야 한다.

만일 SHM_RDONLY 가 shmflg 에 지정되면, 이 세그먼트는 읽기전용으로 연결되며 프로세스는 세그먼트에 읽기 접근 허가권을 가져야만 한다. 그렇지 않으면 세그먼트는 읽기-쓰기로 연결되며 프로세스는 세그먼트에 읽기-쓰기 접근 허가권들을 가져야만 한다. 쓰기전용 공유메모리 세그먼트에 대한 표시는 없다.

호출 프로세스의 brk 값은 연결시 바뀌어지지 않는다. 세그먼트는 프로세스가 종료할때 자동적으로 분리된다. 같은 세그먼트는 그 프로세스 주소 공간에서 읽기 전용으로, 읽기-쓰기로, 한번 이상 연결될수 있다.

성공시 shmat 시스템 콜은 공유 메모리 세그먼트에서 다음과 같은 shmid_ds 구조체 멤버들을 갱신한다.

    shm_atime 는 현재 시간으로 설정된다.

    shm_lpid 는 호출 프로세스의 프로세스-ID로 설정된다.

    shm_nattch 는 1 증가한다.

공유 메모리 세그먼트가 삭제로서 표시될 경우도 역시 분리 된다.

함수 shmdt 는 호출 프로세스의 데이타 세그먼트에서 shmaddr 로 지정된 주소에 위치한 공유 메모리 세그먼트를 분리한다. 공유 메모리 세그먼트의 분리는 shmat 시그템 콜로 연결된 값과 같은 shmaddr 를 가지고 있는 현재 연결된 세그먼트들중 하나(프로세스의 주소 공간)이어야 한다.

성공시, shmdt 시스템 콜은 공유 메모리 세그먼트에서 다음과 같은 shmid_ds 구조체 멤버들을 갱신한다.

    shm_dtime 는 현재 시간으로 설정된다.

    shm_lpid 는 호출 프로세스의 프로세스-ID로 설정된다.

    shm_nattch 는 1 감소한다. 만일 0이고 세그먼트가 삭제 표시되어 있드면 세그먼트는 삭제된다.

호출 프로세스의 유저 공간에 점유된 영역은 대응이 풀리지 않는다.

SYSTEM CALLS

fork()
    fork() 후에 자식 프로세스는 연결된 공유 메모리 세그먼트들을 상속한다.

exec()
    exec() 후에 모든 연결된 공유 메모리 세그먼트들은 분리된다.(파괴되는것이 아니다.)

exit()
    exit() 시 모든 연결된 공유 메모리 세그먼트는 분리된다.(파괴되는 것이 아니다.)

반환값
실패시 두 함수는 모두 에러를 가리키는 errno 와 -1 를 리턴하며 그렇지 않으면 shmat 는 연결된 공유 메모리 세그먼트의 주소를 리턴한다. 그리고 shmdt 는 0 를 리턴한다.

에러
shmat 가 실패할때, 리턴되는 errno 는 다음값중 하나로 설정된다.

EACCES
    호출 프로세스는 요구된 연결 타입에 대한 접근 허가권들이 없다.

EINVAL
    유효하지 않은 shmid 값, 정렬되지 않은(즉, 페이지 정렬이 아니고 SHM_RND가 지정되지 않았다.) 또는 유효하지 않은 shmaddr 값, 또는 brk 에 연결 실패

ENOMEM
    기술자나 페이지 테이블들을 위해 메모리를 할당할수 없다.

shmaddr 에 연결된 공유 메모리 세그먼트가 없다면 함수 shmdt 는 실패할수 있다. 이경우 리턴되는 errno 는 EINVAL 으로 설정될 것이다.

주의
fork(2) 시스템 콜 실행시 자식 프로세스는 연결된 모든 공유 메모리 세그먼트둘을 상속한다.

execve(2) 로 실행되는 프로세스에 연결된 공유 메모리 세그먼트들은 결과 프로세스에 연결되지 않을 것이다.

다음은 shmat 시스템 콜에 영향을 미치는 시스템 인자이다:

SHMLBA
    Segment low boundary address multiple. 페이지들은 정렬되어야 한다. 현재 수행시 SHMBLA 값은 PAGE_SIZE 이다.

수행시 프로세스당 공유 메모리 세그먼트 최대수에 어떠한 내부 제한도 없다. (SHMSEG)

호환
SVr4, SVID. SVr4는 EMFILE 에러 조건을 문서화했다. SVID-v4에서 shmaddr 인자는 char * 에서 const void * 로 바뀌었으며 shmat()의 리턴 타입은 char * 에서 void * 으로 바뀌었다. (Linux libc4 와 libc5는 char * 타입을 가지고 있다.; glibc2는 void * 을 가지고 있다.)

관련 항목
ipc(5), shmctl(2), shmget(2)

역자
정강훈 <skyeyes@soback.kornet.net>, 2000년 5월 16일