SHMGET
Section: 리눅스 프로그래머 메뉴얼 (2)
Updated: November 28, 1993
Index
Return to Main Contents
이름
shmget - 공유 메모리 세그먼트를 할당한다.
사용법
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, int size, int shmflg);
설명
shmget()
는
key
인자값과 관련된 공유 메모리 세그먼트 식별자를 반환한다.
만일,
key
가
IPC_PRIVATE
값을 가지고 있거나 또는
key
가
IPC_PRIVATE
가 아니고,
key
와 연계되어 있는 공유메모리 세그먼트가 없다면
PAGE_SIZE
의 배수만큼의
size
를 가지고 있는 새로운 공유 메모리 세그먼트가 만들어진다.
IPC_CREAT
는
shmflg
에 명시되어 있다.
(즉,
shmflg&IPC_CREAT
는 0이 아니다.)
shmflg
의 구성은 다음과 같다:
- IPC_CREAT
-
새로운 세그먼트를 만든다. 만일 이 플래그가 사용되지 않는다면,
shmget()
는 key와 관련된 세그먼트를 찾을 것이며,
사용자가 그 세그먼트와 관련된 shmid 를 받을
허가권이 있는지 알기 위해서 검사한다.
그리고 세그먼트가 파괴되었다는 표시를 하지 않도록 보장한다.
- IPC_EXCL
-
세그먼트가 존재할경우 실패를 보장하기 위해 IPC_CREAT와 함께
사용된다.
- mode_flags (lowest 9 bits)
-
소유자, 그룹, 그 외들을 보장하기 위해 허가권을 지정한다.
현재, 실행 허가권은 시스템에 의해 사용되지 않는다.
새로운 세그먼트가 생성된다면,
shmflg
의 접근 허가권은
세그먼트에 정의되어 있는
shmid_ds
의
shm_perm
멤버로 복사된다.
shmid_ds 구조체:
struct shmid_ds {
struct ipc_perm shm_perm; /* 퍼미션 */
int shm_segsz; /* 세그먼트의 크기(bytes) */
time_t shm_atime; /* 마지막 접근 시간 */
time_t shm_dtime; /* 마지막 제거 시간 */
time_t shm_ctime; /* 마지막 변경 시간 */
unsigned short shm_cpid; /* 생성자의 pid */
unsigned short shm_lpid; /* 마지막으로 작동한 프로세스 pid */
short shm_nattch; /* 현재 접근한 프로세스의 수 */
};
struct ipc_perm
{
key_t key;
ushort uid; /* 소유자의 euid 와 egid */
ushort gid;
ushort cuid; /* 생성자의 euid 와 egid */
ushort cgid;
ushort mode; /* shmflg의 하위 9비트 */
ushort seq; /* 연속 수(sequence number) */
};
게다가, 생성되는 동안 시스템 콜은 시스템 공유 메모리 세그먼트 데이터 구조
shmid_ds
를 다음과 같이 초기화한다.
-
shm_perm.cuid
와
shm_perm.uid
는 호출 프로세스의 유효 user-ID로 설정된다.
-
shm_perm.cgid
와
shm_perm.gid
는 호출 프로세스의 유효 group-ID로 설정된다.
-
shm_perm.mode
의 하위 9비트들은
shmflg
의 하위 9비트들로 설정된다.
-
shm_segsz
는
size
값으로 설정된다.
-
shm_lpid,
shm_nattch,
shm_atime
그리고
shm_dtime
는
0
으로 설정된다.
-
shm_ctime
는 현재 시간으로 설정된다.
만일 공유 메모리 세그먼트가 이미 존재한다면, 접근 허가권이 조사되며,
파괴도도록 표시되어 있는지 알아보기 위해 검사한다.
SYSTEM CALLS
- fork()
-
fork()
후에 자식 프로세스는 연결된 공유 메모리 세그먼트들을 상속한다.
- exec()
-
exec()
후에 연결된 모든 공유 메모리 세그먼트는 분리된다.(파괴되는것이 아니다)
- exit()
-
exit()
시 연결된 모든 공유 메모리 세그먼트는 분리된다.(파괴되는것이 아니다)
반환값
성공시 유효한 세그먼트 식별자
shmid
가 반환되며, 에러시 -1이 반환된다.
에러
실패시,
errno
는 다음중 하나로 설정된다:
- EINVAL
-
만일 SHMMIN > size, 또는
size > SHMMAX, 또는 size이 세그먼트의 크기보다 크다면 이
에러가 반환된다.
- EEXIST
-
IPC_CREAT | IPC_EXCL
이 지정되어 있고, 세그먼트가 존재하면 이 에러가 반환된다.
- EIDRM
-
세그먼트가 파괴나 제거되도록 표시되어 있다면 이 에러가 반환된다.
- ENOSPC
-
가능한 모든 공유 메모리 id
(SHMMNI)
를 가졌거나 요청된
size
의 세그먼트 할당이 시스템 전체 공유 메모리 제한값
(SHMALL)
을 초과할경우 반환된다.
- ENOENT
-
주어진 key에 해당하는 세그먼트가 존재하지 않고,
IPC_CREAT
가 지정되지 않았다면 반환된다.
- EACCES
-
사용자가 공유 메모리 세그먼트에 대한 접근 허가권이 없을때 반환된다.
- ENOMEM
-
세그먼트를 위해 할당할 메모리가 없을때 반환된다.
주의
IPC_PRIVATE
는 플레그 필드가 아니라
key_t
타입이다.
이 특별한 값이
key
에 사용된다면,
시스템 콜은
shmflg
의 하위 9비트들외 모든것을 무시한다.
그리고 새 공유 메모리 세그먼트를 생성(성공시)한다.
다음은
shmget
시스템 콜에 영향을 주는 공유 메모리 세그먼트 자원들의 제한값들이다:
- SHMALL
-
시스템 전체의 공유 메모리 세그먼트 최대 값: 정책 의존적이다.
- SHMMAX
-
공유 메모리 세그먼트의 최대 크기(바이트수): 수행 의존적이다.(현재 4M)
- SHMMIN
-
공유 메모리 세그먼트의 최소 크기(바이트수): 수행 의존적이다.(
PAGE_SIZE
가 유효한 최소 크기이지만, 현재는 1byte이다.)
- SHMMNI
-
시스템 전체의 공유 메모리 세그먼트 최대 수: 수행 의존적이다(현재 4096)
수행시 프로세스당 공유 메모리 세그먼트의 특별한 제한은 없다.
(SHMSEG)
버그
IPC_PRIVATE
를 사용하면 할당된 공유 메모리 세그먼트를 접근하는 다른 프로세스들을 저지하지
않는다.
파일들 때문에, 프로세스를 위해 공유 메모리 세그먼트에 대한 배타적 접근을
보장하기 위한 방법이 현재는 없다.
shmflg
비트에
IPC_CREAT
와
IPC_EXCL
의 지정만이 새 공유 메모리 세그먼트 생성을 보장(성공시)한다.
이것은 세그먼트에 대한 배타적 접근을 나타내는 것은 아니다.
호환
SVr4, SVID. SVr4 문서는 EEXIST 에러 조건을 추가적으로 기술했다.
SVr4 와 SVID 문서들은 EIDRM 조건을 기술하지 않았다.
관련 항목
ftok(3),
ipc(5),
shmctl(2),
shmat(2),
shmdt(2)
번역
정강훈 <skyeyes@soback.kornet.net> 2000년 5월 16일
한글 Manpage 프로젝트 (http://man.kldp.org) 2005년 2월 13일
Index
- 이름
-
- 사용법
-
- 설명
-
- SYSTEM CALLS
-
- 반환값
-
- 에러
-
- 주의
-
- 버그
-
- 호환
-
- 관련 항목
-
- 번역
-
This document was created by
man2html,
using the manual pages.
Time: 06:54:53 GMT, February 13, 2005