다음 위로 이전 목차 리눅스 프로그래머를 위한 가이드

시스템 호출:shmat() (SYSTEM CALL:shmat())


  SYSTEM CALL: shmat();                                                          

  PROTOTYPE: int shmat ( int shmid, char *shmaddr, int shmflg);
    RETURNS: address at which segment was attached to the process, or
             -1 on error: errno = EINVAL (Invalid IPC ID value or attach address passed)
                                  ENOMEM (Not enough memory to attach segment)
                                  EACCES (Permission denied)
  NOTES:

addr 아규먼트가 제로(0)이면, 커널은 매핑되지 않은 지역을 찾으려고 한다. 이것은 추천방법이다. 주소는 지정될 수 있지만, 전통적으로 독점적으로 하드웨어를 이용하거나 다른 응용프로그램과의 충돌을 피하기 위해 사용된다. SHM_RND 플래그는 넘겨진 주소에 페이지를 정렬(align)시키는 첫번째 아규먼트에 OR될 수 있다.(가장 근접한 페이지 크기로 줄여서)

게다가, SHM_RDONLY 플래그가 플래그 아규먼트에 OR되면, 공유 메모리 세그먼트는 매핑되어지지만, 읽기전용(readonly)로 표시된다.

이 호출은 아마도 사용하기에 가장 쉬울 것이다. 세그먼트를 위한 유효한 IPC 확인자가 넘겨지고 세그먼트가 붙여진 주소를 반환하는 wrapper 함수를 생각해 보자.


char *attach_segment( int shmid )
{
        return(shmat(shmid, 0, 0));
}

세그먼트가 적당하게 붙여진(attached) 다음, 프로세스는 그 세그먼트의 시작점을 가리키는 포인터를 갖는다. 세그먼트에 대한 읽기와 쓰기는 간단히 포인터를 참조하거나 참조되어지는 것처럼 쉽게 이루어 진다. 원래의 포인터 값을 잃어버리지 않도록 주의해라! 만약 그런 일이 발생한다면, 세그먼트의 기초(시작점)에 접근하는 방법이 없게 된다.


이전:시스템 호출:shmget() 다음:시스템 호출:shmctl()

Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved

Email To:Webmaster , Another address
LAST UPDATE Nov 28,1997
Created Nov 28,1997