SHMOP(2) | 리눅스 프로그래머 메뉴얼 | 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¶
반환값¶
실패시 두 함수는 모두 에러를 가리키는 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 * 을 가지고 있다.)
관련 항목¶
역자¶
정강훈 <skyeyes@soback.kornet.net>, 2000년 5월 16일
November 28, 1993 | Linux 0.99.13 |