shmget()은 주어진 인자 key를 접근번호로 하는
공유메모리 공간할당을 커널(:12)에 요청한다. 커널에서 성공적으로 공유메모리
공간을 할당하게 되면 공유메모리를 가르키는 식별자를 리턴하게 된다.
생성될 공유메모리 공간의 크기는 size를 통해서
byte 단위 크기로 지정할 수 있다. 공간의 할당은
shmflg가 IPC_PRIVATE이거나 key
를 가지는 공유메모리영역이 존재하지 않거나, IPC_CREAT가 지정되었을 경우
(shmflg&IPC_CREAT가 0이 아닌)에 이루어진다.
다음은 사용가능한 shmflg값들이다.
IPC_CREAT
새로운 영역을 할당한다. 만약 이 값이 사용되지 않았다면,
shmget()은 key로 이미 생성된 접근 가능한
공유메모리 영역이 있는지 확인하고 이에 대한 식별자를
되돌려줄 것이다.
IPC_EXCL
IPC_CREAT와 함께 사용하며 공유메모리 영역이 이미 존재하면 에러를
리턴한다.
mode_flags(하위 9bit)
접근 권한의 지정을 위해서 사용한다. 실행권한은 사용하지 않는다.
만약 새로운 영역이 생성되었다면 shmflg의 권한정보는 영역에 대한 정보가
정의되어 있는 shmid_ds 구조체의 멤버인 shm_perm으로 복사된다. shmid_ds
구조체는 아래와 같이 정의되어 있다.
struct shmid_ds {
struct ipc_perm shm_perm; /* operation perms */
int shm_segsz; /* size of segment (bytes) */
time_t shm_atime; /* last attach time */
time_t shm_dtime; /* last detach time */
time_t shm_ctime; /* last change time */
unsigned short shm_cpid; /* pid of creator */
unsigned short shm_lpid; /* pid of last operator */
short shm_nattch; /* no. of current attaches */
};
struct ipc_perm {
key_t key;
ushort uid; /* owner euid and egid */
ushort gid;
ushort cuid; /* creator euid and egid */
ushort cgid;
ushort mode; /* lower 9 bits of shmflg */
ushort seq; /* sequence number */
};
1장. shmget(2)
공유메모리(:12) 영역을 할당한다.
1.1. 사용법
1.2. 설명
shmget()은 주어진 인자 key를 접근번호로 하는 공유메모리 공간할당을 커널(:12)에 요청한다. 커널에서 성공적으로 공유메모리 공간을 할당하게 되면 공유메모리를 가르키는 식별자를 리턴하게 된다. 생성될 공유메모리 공간의 크기는 size를 통해서 byte 단위 크기로 지정할 수 있다. 공간의 할당은 shmflg가 IPC_PRIVATE이거나 key 를 가지는 공유메모리영역이 존재하지 않거나, IPC_CREAT가 지정되었을 경우 (shmflg&IPC_CREAT가 0이 아닌)에 이루어진다.
다음은 사용가능한 shmflg값들이다.
새로운 영역을 할당한다. 만약 이 값이 사용되지 않았다면, shmget()은 key로 이미 생성된 접근 가능한 공유메모리 영역이 있는지 확인하고 이에 대한 식별자를 되돌려줄 것이다.
IPC_CREAT와 함께 사용하며 공유메모리 영역이 이미 존재하면 에러를 리턴한다.
접근 권한의 지정을 위해서 사용한다. 실행권한은 사용하지 않는다.
만약 새로운 영역이 생성되었다면 shmflg의 권한정보는 영역에 대한 정보가 정의되어 있는 shmid_ds 구조체의 멤버인 shm_perm으로 복사된다. shmid_ds 구조체는 아래와 같이 정의되어 있다.
1.3. 시스템 호출에 대한 반응
attache된 공유 메모리 공간은 자식 프로세스에게 상속된다.
exec()가 호출된 후에는 모든 공유 메모리 공간은 detache된다.
exit()후 모든 공유 메모리 공간은 detache된다 (없어 지지는 않는다).
1.4. 반환값
성공하면 shmid를 반환, 실패하면 -1을 반환한다.
1.5. 에러
공유 영역생성시 너무 작은 공간을 할당 하거나(size < SHMMIN) 너무 큰 공간(size > SHMMAX)을 할당했을 경우
IPC_CREAT | IPC_EXCL 로 생성을 요청했는데, 이미 공유 메모리 영역이 존재하고 있을 경우,
size만큼의 공간을 할당할 수 없을 경우. 사용가능한 공간은 SHMALL값으로 커널전역적으로 정의되어 있다. (/usr/include/linux/shm.h 참고)
IPC_CREAT를 사용하지 않았는데, 해당 key를 가지는 공유 메모리 영역이 존재 하지 않는 경우
공유 메모리 영역에 대한 접근권한이 주어져 있지 않다.
이용할 수 있는 커널 메모리가 충분하지 않다.
1.6. 예제
공유 메모리참고
1.7. 참고문헌
공유 메모리를 이용한 프로세스간 데이터 교환
ftok(3)
ipc(5)
shmctl(2)
shmat(2)
shmdt(2)
Recent Posts
Archive Posts
Tags