shmget 서브루틴

용도

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

라이브러리

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

Syntax

#include <sys/shm.h>

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

설명

shmget 서브루틴은 지정된 Key 매개변수와 연관된 공유 메모리 ID를 리턴합니다. 공유 메모리 한계에 대한 정보는 통신 한계 프로세스를 참조하십시오.

Parameters

항목 설명
젖병 서브루틴 (또는 유사한 알고리즘) 으로 구성된 IPC키 또는 IPC_PRIVATE 값을 지정합니다.
size 필요한 공유 메모리의 바이트 수를 지정합니다.
SharedMemory플래그 다음 값 중 하나 이상을 논리적으로 OR 처리하여 구성합니다.
IPC_CREAT
데이터 구조가 아직 존재하지 않는 경우 이를 작성합니다.
IPC_EXCL
IPC_CREAT 플래그도 설정되어 있고 데이터 구조가 이미 존재하는 경우 shmget 서브루틴이 실패하게 됩니다.
SHM_LGPAGE
사용 가능한 경우, 하드웨어 지원, 대형 페이지 메커니즘을 통해 맵핑될 수 있도록 영역을 작성하려고 시도합니다. 이것은 순전히 조언이다. For the system to consider this flag, it must be used in conjunction with the SHM_PIN flag and enabled with the vmtune command (-L to reserve memory for the region (which requires a reboot) and -S to enable SHM_PIN). 대형 페이지를 성공적으로 가져오려면 대형 페이지 공유 메모리를 요청하는 사용자에게 CAP_BYPASS_RAC_VMM 기능이 있어야 합니다. 이는 EXTSHM=ON 환경 변수로 작성된 공유 메모리 영역에는 영향을 주지 않는다.
SHM_PIN
사용 가능한 경우 공유 메모리 영역을 고정하려고 합니다. 이것은 순전히 조언이다. 이 플래그를 고려하는 시스템의 경우 vmtune 명령으로 사용 가능해야 합니다. 이는 EXTSHM=ON 환경 변수로 작성된 공유 메모리 영역에는 영향을 주지 않는다.
SHM_HGSEG
1 TB 세그먼트 크기를 갖는 공유 메모리 영역을 작성합니다. 이것은 순전히 조언이다. 시스템이 이 플래그를 고려하려면 SHM_LGPAGESHM_PIN 플래그와 함께 사용해야 하며 vmo 명령 (vmo -o hugeseg_shm_mode=1) 과 함께 사용 가능해야 합니다. 1 TB 세그먼트 크기를 성공적으로 얻으려면 대형 페이지도 확보해야 합니다. 이 플래그는 EXTSHM=ON 환경 변수 또는 32비트 애플리케이션에서 작성된 공유 메모리 영역에는 영향을 주지 않는다.
S_IRUSR
데이터 구조를 소유하는 프로세스가 이를 읽도록 허용합니다.
S_IWUSR
데이터 구조를 소유하는 프로세스가 이를 수정하도록 허용합니다.
S_IRGRP
데이터 구조와 연관된 그룹이 이를 읽도록 허용합니다.
S_IWGRP
데이터 구조와 연관된 그룹을 허용하여 수정합니다.
S_IROTH
다른 사용자가 데이터 구조를 읽도록 허용합니다.
S_IWOTH
다른 사용자가 데이터 구조를 수정할 수 있도록 허용합니다.

S_I 접두부로 시작하는 값은 sys/mode.h 파일에 정의되며 파일에 적용되는 액세스 권한의 서브세트입니다.

다음 중 하나가 참인 경우 공유 메모리 ID, 연관된 데이터 구조 및 공유 메모리 세그먼트가 Size 매개변수의 값과 동일한 바이트 수와 같은 경우 Key 매개변수에 대해 작성됩니다.
  • 매개변수는 IPC_PRIVATE 값과 같습니다.
  • Key 매개변수에는 공유 메모리 ID가 연관되어 있지 않으며 IPC_CREAT 플래그가 SharedMemory플래그 매개변수에 설정되어 있습니다.
생성 시, 새로운 공유 메모리 식별자와 연관된 데이터 구조는 다음과 같이 초기화된다:
  • shm_perm.cuidshm_perm.uid필드는 호출 프로세스의 유효 사용자 ID로 설정된다.
  • shm_perm.cgidshm_perm.gid필드는 호출 프로세스의 유효 그룹 ID로 설정된다.
  • 다음의 하위 순서 9 비트shm_perm.mode필드는 SharedMemory플래그 매개변수의 하위 9비트로 설정됩니다.
  • shm_segsz필드는 Size 매개변수 값으로 설정됩니다.
  • 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 공유 메모리 ID가 Key 매개변수에 대해 존재하지만 SharedMemory플래그 매개변수의 하위 9비트에 지정된 조작 권한이 부여되지 않았습니다.
EEXIST 공유 메모리 ID가 Key 매개변수에 대해 존재하며 IPC_CREAT IPC_EXCL 플래그 둘 다 SharedMemory플래그 매개변수에 설정됩니다.
EINVAL 공유 메모리 ID가 존재하지 않으며 Size 매개변수는 시스템이 부과한 최소값보다 작거나 시스템이 부과한 최대값보다 큽니다.
EINVAL 공유 메모리 ID가 Key 매개변수에 대해 존재하지만 연관된 세그먼트의 크기가 Size 매개변수보다 작고 Size 매개변수가 0과 같지 않습니다.
ENOENT 공유 메모리 ID가 Key 매개변수에 대해 존재하지 않으며 IPC_CREAT 플래그가 SharedMemoryFlag 매개변수에 설정되어 있지 않습니다.
ENOMEM 공유 메모리 식별자 및 연관된 공유 메모리 세그먼트가 작성되어야 하지만 사용 가능한 실제 메모리의 양이 요청을 충족시키기에 충분하지 않습니다.
ENOSPC 공유 메모리 식별자가 작성되지만, 허용되는 시스템에 부과된 최대 공유 메모리 식별자가 초과될 것입니다.