shmget 서브루틴

용도

공유 메모리 세그먼트를 가져옵니다.

라이브러리

표준 C 라이브러리(libc.a)

구문

#include <sys/shm.h>

int shmget (Key, Size, SharedMemoryFlag)
key_t  Key;
size_t  Size
int  SharedMemoryFlag;

설명

Shmget 서브루틴은 지정된 Key 매개변수와 연결된 공유 메모리 식별자를 반환합니다. 공유 메모리 제한에 대한 자세한 내용은 다음을 참조하세요: 프로세스 간 통신 제한을 참조하세요.

매개변수

항목 설명
Ftok 서브루틴(또는 유사한 알고리즘)에 의해 생성된 IPC_PRIVATE 값 또는 IPC 키를 지정합니다.
size 필요한 공유 메모리 바이트 수를 지정합니다.
SharedMemoryFlag 다음 값 중 하나 이상을 논리적으로 OR하여 구성합니다:
IPC_CREAT
데이터 구조가 아직 존재하지 않는 경우 생성합니다.
IPC_EXCL
IPC_CREAT 플래그도 설정되어 있고 데이터 구조가 이미 존재하는 경우 shmget 서브루틴이 실패합니다.
SHM_LGPAGE
하드웨어 지원 대형 페이지 메커니즘을 통해 매핑할 수 있도록 영역을 생성하려고 시도합니다(활성화된 경우). 이는 순전히 권고 사항입니다. 시스템에서 이 플래그를 고려하려면 SHM_PIN 플래그와 함께 사용하고 vmtune 명령(-L '은 리전 메모리 예약(재부팅 필요), ' -S '는 SHM_PIN 활성화)을 통해 활성화해야 합니다. 대용량 페이지를 성공적으로 가져오려면 대용량 페이지 공유 메모리를 요청하는 사용자에게 CAP_BYPASS_RAC_VMM 기능이 있어야 합니다. EXTSHM=ON 환경 변수로 생성된 공유 메모리 영역에는 영향을 미치지 않습니다.
SHM_PIN
활성화된 경우 공유 메모리 영역을 고정하려고 시도합니다. 이는 순전히 권고 사항입니다. 시스템에서 이 플래그를 고려하려면 vmtune 명령으로 이 플래그를 사용하도록 설정해야 합니다. EXTSHM=ON 환경 변수로 생성된 공유 메모리 영역에는 영향을 미치지 않습니다.
SHM_HGSEG
1TB 세그먼트 크기의 공유 메모리 영역을 생성합니다. 이는 순전히 권고 사항입니다. 시스템에서 이 플래그를 고려하려면 SHM_LGPAGESHM_PIN 플래그와 함께 사용해야 하며 vmo 명령(vmo -o hugeseg_shm_mode=1)으로 활성화해야 합니다. 1TB 세그먼트 크기를 성공적으로 가져오려면 큰 페이지도 가져와야 합니다. 이 플래그는 EXTSHM=ON 환경 변수로 생성된 공유 메모리 영역이나 32비트 애플리케이션에는 영향을 미치지 않습니다.
S_IRUSR
데이터 구조를 소유한 프로세스가 이를 읽을 수 있도록 허용합니다.
S_IWUSR
데이터 구조를 소유한 프로세스가 데이터 구조를 수정할 수 있도록 허용합니다.
S_IRGRP
데이터 구조와 연결된 그룹이 데이터를 읽을 수 있도록 허용합니다.
S_IWGRP
데이터 구조와 연결된 그룹이 수정할 수 있도록 허용합니다.
S_IROTH
다른 사람이 데이터 구조를 읽을 수 있도록 허용합니다.
S_IWOTH
다른 사람이 데이터 구조를 수정할 수 있도록 허용합니다.

S_I 접두사로 시작하는 값은 sys/mode.h 파일에 정의되어 있으며 파일에 적용되는 액세스 권한의 하위 집합입니다.

다음 중 하나에 해당하는 경우 Key 매개변수에 대해 공유 메모리 식별자, 관련 데이터 구조 및 Size 매개변수 값과 동일한 바이트 수의 공유 메모리 세그먼트가 생성됩니다:
  • Key 매개변수는 IPC_PRIVATE 값과 동일합니다.
  • Key 매개변수에 공유 메모리 식별자가 이미 연결되어 있지 않으며, IPC_CREAT 플래그가 SharedMemoryFlag 매개변수에 설정되어 있습니다.
생성 시 새 공유 메모리 식별자와 관련된 데이터 구조는 다음과 같이 초기화됩니다:
  • 다음shm_perm.cuidshm_perm.uid필드는 호출 프로세스의 유효 사용자 ID로 설정됩니다.
  • 다음shm_perm.cgidshm_perm.gid필드는 호출 프로세스의 유효 그룹 ID로 설정됩니다.
  • 저차 9비트의shm_perm.mode필드의 하위 9번째 비트는 SharedMemoryFlag 매개변수의 하위 9번째 비트로 설정됩니다.
  • 다음shm_segsz필드는 크기 매개변수의 값으로 설정됩니다.
  • 다음 shm_lpid,shm_nattch,shm_atimeshm_dtime필드가 0으로 설정됩니다.
  • 다음shm_ctime필드가 현재 시간으로 설정됩니다.
    참고: 일단 생성된 공유 메모리 세그먼트는 시스템을 재부팅하거나 ipcrm 명령을 실행하거나 다음 shmctl 하위 루틴을 사용하여 삭제할 때만 삭제됩니다:
    if (shmctl (id, IPC_RMID, 0) == -1)
     perror ("error in closing segment"),exit (1);

리턴 값

성공적으로 완료되면 공유 메모리 식별자가 반환됩니다. 그렇지 않으면 shmget 서브루틴이 -1 값을 반환하고 오류를 나타내는 errno 전역 변수를 설정합니다.

오류 코드

다음 중 하나 이상에 해당하면 shmget 서브루틴은 실패합니다:

항목 설명
EACCES Key 매개변수에 대한 공유 메모리 식별자가 존재하지만 SharedMemoryFlag 매개변수의 하위 9비트에 지정된 작업 권한은 부여되지 않습니다.
EEXIST ' 매개변수에 대한 공유 메모리 식별자가 존재하며 ' IPC_CREAT ' 및 IPC_EXCL ' 플래그는 모두 ' SharedMemoryFlag ' 매개변수에 설정되어 있습니다.
EINVAL 공유 메모리 식별자가 존재하지 않고 Size 매개변수가 시스템에서 부과한 최소값보다 작거나 시스템에서 부과한 최대값보다 큽니다.
EINVAL Key 매개변수에 대한 공유 메모리 식별자가 존재하지만 이와 연결된 세그먼트의 크기가 Size 매개변수보다 작고 Size 매개변수가 0이 아닌 경우입니다.
ENOENT Key 매개변수에 대한 공유 메모리 식별자가 존재하지 않으며, SharedMemoryFlag 매개변수에 IPC_CREAT 플래그가 설정되어 있지 않습니다.
ENOMEM 공유 메모리 식별자 및 관련 공유 메모리 세그먼트가 생성되어야 하지만 사용 가능한 물리적 메모리의 양이 요청을 충족하기에 충분하지 않습니다.
ENOSPC 공유 메모리 식별자가 생성되지만 시스템에서 허용하는 최대 공유 메모리 식별자 수를 초과하게 됩니다.